From 3320e07b701bfedf79662c7091f40f1db7671d20 Mon Sep 17 00:00:00 2001 From: bctiemann Date: Fri, 20 Feb 2026 13:52:42 -0500 Subject: [PATCH 001/104] Closes #21284: Add deprecation note to webhooks documentation (#21491) * Add searchable deprecation comments on request_id and username fields in EventContext * Add deprecation note in webhooks documentation * Expand deprecation note/warning * Add version number to deprecation warning * Add deprecation warning to two other places --- docs/integrations/webhooks.md | 5 +++++ docs/models/extras/webhook.md | 5 +++++ docs/plugins/development/webhooks.md | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/docs/integrations/webhooks.md b/docs/integrations/webhooks.md index bfe9ddb2d..4e6271ae9 100644 --- a/docs/integrations/webhooks.md +++ b/docs/integrations/webhooks.md @@ -31,6 +31,11 @@ The following data is available as context for Jinja2 templates: * `data` - A detailed representation of the object in its current state. This is typically equivalent to the model's representation in NetBox's REST API. * `snapshots` - Minimal "snapshots" of the object state both before and after the change was made; provided as a dictionary with keys named `prechange` and `postchange`. These are not as extensive as the fully serialized representation, but contain enough information to convey what has changed. +!!! warning "Deprecation of legacy fields" + The "request_id" and "username" fields in the webhook payload above are deprecated and should no longer be used. Support for them will be removed in NetBox v4.7.0. + + Use `request.user.username` and `request.request_id` from the `request` object included in the callback context instead. + ### Default Request Body If no body template is specified, the request body will be populated with a JSON object containing the context data. For example, a newly created site might appear as follows: diff --git a/docs/models/extras/webhook.md b/docs/models/extras/webhook.md index 05ade8666..932425434 100644 --- a/docs/models/extras/webhook.md +++ b/docs/models/extras/webhook.md @@ -88,3 +88,8 @@ The following context variables are available in to the text and link templates. | `request_id` | The unique request ID | | `data` | A complete serialized representation of the object | | `snapshots` | Pre- and post-change snapshots of the object | + +!!! warning "Deprecation of legacy fields" + The "request_id" and "username" fields in the webhook payload above are deprecated and should no longer be used. Support for them will be removed in NetBox v4.7.0. + + Use `request.user.username` and `request.request_id` from the `request` object included in the callback context instead. diff --git a/docs/plugins/development/webhooks.md b/docs/plugins/development/webhooks.md index 755d19d42..5d98ab620 100644 --- a/docs/plugins/development/webhooks.md +++ b/docs/plugins/development/webhooks.md @@ -43,6 +43,11 @@ The resulting webhook payload will look like the following: } ``` +!!! warning "Deprecation of legacy fields" + The "request_id" and "username" fields in the webhook payload above are deprecated and should no longer be used. Support for them will be removed in NetBox v4.7.0. + + Use `request.user.username` and `request.request_id` from the `request` object included in the callback context instead. + !!! note "Consider namespacing webhook data" The data returned from all webhook callbacks will be compiled into a single `context` dictionary. Any existing keys within this dictionary will be overwritten by subsequent callbacks which include those keys. To avoid collisions with webhook data provided by other plugins, consider namespacing your plugin's data within a nested dictionary as such: From 6eafffb49723263c8e343b7bf9c50337efe725fb Mon Sep 17 00:00:00 2001 From: bctiemann Date: Tue, 3 Mar 2026 16:12:39 -0500 Subject: [PATCH 002/104] Closes: #21304 - Add stronger deprecation warning on use of housekeeping management command (#21483) * Add stronger deprecation warning on use of housekeeping management command * Add stronger deprecation warning on use of housekeeping management command * Rework deprecation warning to use FutureWarning (not DeprecationWarning as that is ignored in non-dev environments). --- netbox/extras/management/commands/housekeeping.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/netbox/extras/management/commands/housekeeping.py b/netbox/extras/management/commands/housekeeping.py index 0d8a7e0b9..63a5e5b61 100644 --- a/netbox/extras/management/commands/housekeeping.py +++ b/netbox/extras/management/commands/housekeeping.py @@ -1,3 +1,4 @@ +import warnings from datetime import timedelta from importlib import import_module @@ -17,11 +18,12 @@ class Command(BaseCommand): help = "Perform nightly housekeeping tasks [DEPRECATED]" def handle(self, *args, **options): - self.stdout.write( + warnings.warn( + "\n\nDEPRECATION WARNING\n" "Running this command is no longer necessary: All housekeeping tasks\n" "are addressed automatically via NetBox's built-in job scheduler. It\n" - "will be removed in a future release.", - self.style.WARNING + "will be removed in a future release.\n", + category=FutureWarning, ) config = Config() From 303199dc8f0018a647efc4ce8b400d5faa73c236 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 25 Feb 2026 17:37:34 -0500 Subject: [PATCH 003/104] Closes #21356: Implement ETag support for REST API --- netbox/netbox/api/viewsets/__init__.py | 47 ++++++++++++++++++++++++-- netbox/utilities/testing/api.py | 47 +++++++++++++++++++++++++- 2 files changed, 91 insertions(+), 3 deletions(-) diff --git a/netbox/netbox/api/viewsets/__init__.py b/netbox/netbox/api/viewsets/__init__.py index bf19bf35e..0c16a1e1c 100644 --- a/netbox/netbox/api/viewsets/__init__.py +++ b/netbox/netbox/api/viewsets/__init__.py @@ -34,6 +34,28 @@ HTTP_ACTIONS = { } +class ETagMixin: + """ + Adds ETag header support to ViewSets. Generates ETags from `last_updated` + (or `created` if unavailable). + """ + + @staticmethod + def _get_etag(obj): + """Return a quoted ETag string for the given object, or None.""" + if ts := getattr(obj, 'last_updated', None) or getattr(obj, 'created', None): + return f'"{ts.isoformat()}"' + return None + + def retrieve(self, request, *args, **kwargs): + instance = self.get_object() + serializer = self.get_serializer(instance) + response = Response(serializer.data) + if etag := self._get_etag(instance): + response['ETag'] = etag + return response + + class BaseViewSet(GenericViewSet): """ Base class for all API ViewSets. This is responsible for the enforcement of object-based permissions. @@ -95,6 +117,7 @@ class BaseViewSet(GenericViewSet): class NetBoxReadOnlyModelViewSet( + ETagMixin, mixins.CustomFieldsMixin, mixins.ExportTemplatesMixin, drf_mixins.RetrieveModelMixin, @@ -105,6 +128,7 @@ class NetBoxReadOnlyModelViewSet( class NetBoxModelViewSet( + ETagMixin, mixins.BulkUpdateModelMixin, mixins.BulkDestroyModelMixin, mixins.ObjectValidationMixin, @@ -191,7 +215,14 @@ class NetBoxModelViewSet( serializer = self.get_serializer(qs, many=bulk_create) headers = self.get_success_headers(serializer.data) - return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) + response = Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) + + # Add ETag for single-object creation only (bulk returns a list, no single ETag) + if not bulk_create: + if etag := self._get_etag(qs): + response['ETag'] = etag + + return response def perform_create(self, serializer): model = self.queryset.model @@ -211,6 +242,14 @@ class NetBoxModelViewSet( def update(self, request, *args, **kwargs): partial = kwargs.pop('partial', False) instance = self.get_object_with_snapshot() + + # Enforce If-Match precondition (RFC 9110 §13.1.1) + if (if_match := request.META.get('HTTP_IF_MATCH')) and if_match != '*': + current_etag = self._get_etag(instance) + provided = [e.strip() for e in if_match.split(',')] + if current_etag and current_etag not in provided: + return Response(status=status.HTTP_412_PRECONDITION_FAILED) + serializer = self.get_serializer(instance, data=request.data, partial=partial) serializer.is_valid(raise_exception=True) self.perform_update(serializer) @@ -221,8 +260,12 @@ class NetBoxModelViewSet( # Re-serialize the instance(s) with prefetched data serializer = self.get_serializer(qs) + response = Response(serializer.data) - return Response(serializer.data) + if etag := self._get_etag(qs): + response['ETag'] = etag + + return response def perform_update(self, serializer): model = self.queryset.model diff --git a/netbox/utilities/testing/api.py b/netbox/utilities/testing/api.py index 7ca8f332d..c2a83a8fb 100644 --- a/netbox/utilities/testing/api.py +++ b/netbox/utilities/testing/api.py @@ -114,7 +114,12 @@ class APIViewTestCases: # Try GET to permitted object url = self._get_detail_url(instance1) - self.assertHttpStatus(self.client.get(url, **self.header), status.HTTP_200_OK) + response = self.client.get(url, **self.header) + self.assertHttpStatus(response, status.HTTP_200_OK) + + # Verify ETag header is present for objects with timestamps + if issubclass(self.model, ChangeLoggingMixin): + self.assertIn('ETag', response, "ETag header missing from detail response") # Try GET to non-permitted object url = self._get_detail_url(instance2) @@ -367,6 +372,46 @@ class APIViewTestCases: self.assertEqual(objectchange.action, ObjectChangeActionChoices.ACTION_UPDATE) self.assertEqual(objectchange.message, data['changelog_message']) + def test_update_object_with_etag(self): + """ + PATCH an object using a valid If-Match ETag → expect 200. + PATCH again with the now-stale ETag → expect 412. + """ + if not issubclass(self.model, ChangeLoggingMixin): + self.skipTest("Model does not support ETags") + + self.add_permissions( + f'{self.model._meta.app_label}.view_{self.model._meta.model_name}', + f'{self.model._meta.app_label}.change_{self.model._meta.model_name}', + ) + instance = self._get_queryset().first() + url = self._get_detail_url(instance) + update_data = self.update_data or getattr(self, 'create_data')[0] + + # Fetch current ETag + get_response = self.client.get(url, **self.header) + self.assertHttpStatus(get_response, status.HTTP_200_OK) + etag = get_response.get('ETag') + self.assertIsNotNone(etag, "No ETag returned by GET") + + # PATCH with correct ETag → 200 + response = self.client.patch( + url, update_data, format='json', + **{**self.header, 'HTTP_IF_MATCH': etag} + ) + self.assertHttpStatus(response, status.HTTP_200_OK) + new_etag = response.get('ETag') + self.assertIsNotNone(new_etag) + self.assertNotEqual(etag, new_etag) # ETag must change after update + + # PATCH with the old (stale) ETag → 412 + with disable_warnings('django.request'): + response = self.client.patch( + url, update_data, format='json', + **{**self.header, 'HTTP_IF_MATCH': etag} + ) + self.assertHttpStatus(response, status.HTTP_412_PRECONDITION_FAILED) + def test_bulk_update_objects(self): """ PATCH a set of objects in a single request. From 694e3765ddabe7451831e9c6defbdfab7a1105b9 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 4 Mar 2026 10:04:30 -0500 Subject: [PATCH 004/104] Use weak ETags --- netbox/netbox/api/viewsets/__init__.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/netbox/netbox/api/viewsets/__init__.py b/netbox/netbox/api/viewsets/__init__.py index 0c16a1e1c..80331b434 100644 --- a/netbox/netbox/api/viewsets/__init__.py +++ b/netbox/netbox/api/viewsets/__init__.py @@ -36,15 +36,17 @@ HTTP_ACTIONS = { class ETagMixin: """ - Adds ETag header support to ViewSets. Generates ETags from `last_updated` - (or `created` if unavailable). + Adds ETag header support to ViewSets. Generates weak ETags (W/ prefix per + RFC 7232 §2.1) from `last_updated` (or `created` if unavailable). Weak ETags + are appropriate here because the tag is derived from a modification timestamp + rather than a hash of the serialized payload. """ @staticmethod def _get_etag(obj): - """Return a quoted ETag string for the given object, or None.""" + """Return a weak ETag string for the given object, or None.""" if ts := getattr(obj, 'last_updated', None) or getattr(obj, 'created', None): - return f'"{ts.isoformat()}"' + return f'W/"{ts.isoformat()}"' return None def retrieve(self, request, *args, **kwargs): From d3a0566ee3384a9efd13c2f63c7c5cf38fc87c4c Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 4 Mar 2026 10:38:12 -0500 Subject: [PATCH 005/104] Address TOCTOU race condition --- netbox/netbox/api/viewsets/__init__.py | 27 ++++++++++++++++++++------ netbox/utilities/exceptions.py | 10 ++++++++++ 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/netbox/netbox/api/viewsets/__init__.py b/netbox/netbox/api/viewsets/__init__.py index 80331b434..42ae1caf9 100644 --- a/netbox/netbox/api/viewsets/__init__.py +++ b/netbox/netbox/api/viewsets/__init__.py @@ -13,7 +13,7 @@ from rest_framework.viewsets import GenericViewSet from netbox.api.serializers.features import ChangeLogMessageSerializer from netbox.constants import ADVISORY_LOCK_KEYS from utilities.api import get_annotations_for_serializer, get_prefetches_for_serializer -from utilities.exceptions import AbortRequest +from utilities.exceptions import AbortRequest, PreconditionFailed from utilities.query import reapply_model_ordering from . import mixins @@ -49,6 +49,20 @@ class ETagMixin: return f'W/"{ts.isoformat()}"' return None + @staticmethod + def _get_if_match(request): + """Return the list of If-Match header values (if specified).""" + if (if_match := request.META.get('HTTP_IF_MATCH')) and if_match != '*': + return [e.strip() for e in if_match.split(',')] + return [] + + def _validate_etag(self, request, instance): + """Validate the request's ETag""" + if provided := self._get_if_match(request): + current_etag = self._get_etag(instance) + if current_etag and current_etag not in provided: + raise PreconditionFailed() + def retrieve(self, request, *args, **kwargs): instance = self.get_object() serializer = self.get_serializer(instance) @@ -246,11 +260,7 @@ class NetBoxModelViewSet( instance = self.get_object_with_snapshot() # Enforce If-Match precondition (RFC 9110 §13.1.1) - if (if_match := request.META.get('HTTP_IF_MATCH')) and if_match != '*': - current_etag = self._get_etag(instance) - provided = [e.strip() for e in if_match.split(',')] - if current_etag and current_etag not in provided: - return Response(status=status.HTTP_412_PRECONDITION_FAILED) + self._validate_etag(self.request, instance) serializer = self.get_serializer(instance, data=request.data, partial=partial) serializer.is_valid(raise_exception=True) @@ -277,6 +287,11 @@ class NetBoxModelViewSet( # Enforce object-level permissions on save() try: with transaction.atomic(using=router.db_for_write(model)): + # Re-check the If-Match ETag under a row-level lock to close the TOCTOU window + # between the initial check in update() and the actual write. + if self._get_if_match(self.request): + locked = model.objects.select_for_update().get(pk=serializer.instance.pk) + self._validate_etag(self.request, locked) instance = serializer.save() self._validate_objects(instance) except ObjectDoesNotExist: diff --git a/netbox/utilities/exceptions.py b/netbox/utilities/exceptions.py index 512bb4b60..8c95f844b 100644 --- a/netbox/utilities/exceptions.py +++ b/netbox/utilities/exceptions.py @@ -6,6 +6,7 @@ __all__ = ( 'AbortScript', 'AbortTransaction', 'PermissionsViolation', + 'PreconditionFailed', 'RQWorkerNotRunningException', ) @@ -40,6 +41,15 @@ class PermissionsViolation(Exception): message = "Operation failed due to object-level permissions violation" +class PreconditionFailed(APIException): + """ + Raised when an If-Match precondition is not satisfied (HTTP 412). + """ + status_code = status.HTTP_412_PRECONDITION_FAILED + default_detail = 'Precondition failed.' + default_code = 'precondition_failed' + + class RQWorkerNotRunningException(APIException): """ Indicates the temporary inability to enqueue a new task (e.g. custom script execution) because no RQ worker From ec0fe62df572d68033b3e2daf27244fb99316c46 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 4 Mar 2026 10:44:37 -0500 Subject: [PATCH 006/104] Include the current ETag in the 412 response --- netbox/netbox/api/viewsets/__init__.py | 8 +++++++- netbox/utilities/exceptions.py | 5 +++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/netbox/netbox/api/viewsets/__init__.py b/netbox/netbox/api/viewsets/__init__.py index 42ae1caf9..f257e3966 100644 --- a/netbox/netbox/api/viewsets/__init__.py +++ b/netbox/netbox/api/viewsets/__init__.py @@ -61,7 +61,13 @@ class ETagMixin: if provided := self._get_if_match(request): current_etag = self._get_etag(instance) if current_etag and current_etag not in provided: - raise PreconditionFailed() + raise PreconditionFailed(etag=current_etag) + + def handle_exception(self, exc): + response = super().handle_exception(exc) + if isinstance(exc, PreconditionFailed) and exc.etag: + response['ETag'] = exc.etag + return response def retrieve(self, request, *args, **kwargs): instance = self.get_object() diff --git a/netbox/utilities/exceptions.py b/netbox/utilities/exceptions.py index 8c95f844b..60ac7d26a 100644 --- a/netbox/utilities/exceptions.py +++ b/netbox/utilities/exceptions.py @@ -44,11 +44,16 @@ class PermissionsViolation(Exception): class PreconditionFailed(APIException): """ Raised when an If-Match precondition is not satisfied (HTTP 412). + Optionally carries the current ETag so it can be included in the response. """ status_code = status.HTTP_412_PRECONDITION_FAILED default_detail = 'Precondition failed.' default_code = 'precondition_failed' + def __init__(self, detail=None, code=None, etag=None): + super().__init__(detail=detail, code=code) + self.etag = etag + class RQWorkerNotRunningException(APIException): """ From b3de0b9beea92183e86c07cd7e824999d616cb64 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 4 Mar 2026 10:49:09 -0500 Subject: [PATCH 007/104] Enforce IF-Match for DELETE requests as well --- netbox/netbox/api/viewsets/__init__.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/netbox/netbox/api/viewsets/__init__.py b/netbox/netbox/api/viewsets/__init__.py index f257e3966..95b2351d3 100644 --- a/netbox/netbox/api/viewsets/__init__.py +++ b/netbox/netbox/api/viewsets/__init__.py @@ -308,6 +308,9 @@ class NetBoxModelViewSet( def destroy(self, request, *args, **kwargs): instance = self.get_object_with_snapshot() + # Enforce If-Match precondition (RFC 9110 §13.1.1) + self._validate_etag(request, instance) + # Attach changelog message (if any) serializer = ChangeLogMessageSerializer(data=request.data) serializer.is_valid(raise_exception=True) @@ -322,7 +325,16 @@ class NetBoxModelViewSet( logger = logging.getLogger(f'netbox.api.views.{self.__class__.__name__}') logger.info(f"Deleting {model._meta.verbose_name} {instance} (PK: {instance.pk})") - return super().perform_destroy(instance) + try: + with transaction.atomic(using=router.db_for_write(model)): + # Re-check the If-Match ETag under a row-level lock to close the TOCTOU window + # between the initial check in destroy() and the actual delete. + if self._get_if_match(self.request): + locked = model.objects.select_for_update().get(pk=instance.pk) + self._validate_etag(self.request, locked) + super().perform_destroy(instance) + except ObjectDoesNotExist: + raise PermissionDenied() class MPTTLockedMixin: From 3c6596de8f0bfb9fcd404de646dbab37c0278351 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 4 Mar 2026 13:39:08 -0500 Subject: [PATCH 008/104] Closes #20916: Record a stack trace in the job log for unhandled exceptions --- netbox/core/tables/jobs.py | 8 ++++++++ netbox/netbox/jobs.py | 7 +++++++ netbox/netbox/tests/test_jobs.py | 4 ++++ 3 files changed, 19 insertions(+) diff --git a/netbox/core/tables/jobs.py b/netbox/core/tables/jobs.py index 2406101a1..e97fb0ac4 100644 --- a/netbox/core/tables/jobs.py +++ b/netbox/core/tables/jobs.py @@ -1,4 +1,6 @@ import django_tables2 as tables +from django.utils.html import conditional_escape +from django.utils.safestring import mark_safe from django.utils.translation import gettext_lazy as _ from core.constants import JOB_LOG_ENTRY_LEVELS @@ -82,3 +84,9 @@ class JobLogEntryTable(BaseTable): class Meta(BaseTable.Meta): empty_text = _('No log entries') fields = ('timestamp', 'level', 'message') + + def render_message(self, record, value): + if record.get('level') == 'error' and '\n' in value: + value = conditional_escape(value) + return mark_safe(f'
{value}
') + return value diff --git a/netbox/netbox/jobs.py b/netbox/netbox/jobs.py index 30afba6fc..8942b831f 100644 --- a/netbox/netbox/jobs.py +++ b/netbox/netbox/jobs.py @@ -1,4 +1,5 @@ import logging +import traceback from abc import ABC, abstractmethod from datetime import timedelta @@ -107,6 +108,12 @@ class JobRunner(ABC): job.terminate(status=JobStatusChoices.STATUS_FAILED) except Exception as e: + tb_record = logging.makeLogRecord({ + 'levelno': logging.ERROR, + 'levelname': 'ERROR', + 'msg': traceback.format_exc(), + }) + job.log(tb_record) job.terminate(status=JobStatusChoices.STATUS_ERRORED, error=repr(e)) if type(e) is JobTimeoutException: logger.error(e) diff --git a/netbox/netbox/tests/test_jobs.py b/netbox/netbox/tests/test_jobs.py index 085047bfc..93bae0e24 100644 --- a/netbox/netbox/tests/test_jobs.py +++ b/netbox/netbox/tests/test_jobs.py @@ -83,6 +83,10 @@ class JobRunnerTest(JobRunnerTestCase): self.assertEqual(job.status, JobStatusChoices.STATUS_ERRORED) self.assertEqual(job.error, repr(ErroredJobRunner.EXP)) + self.assertEqual(len(job.log_entries), 1) + self.assertEqual(job.log_entries[0]['level'], 'error') + self.assertIn('Traceback', job.log_entries[0]['message']) + self.assertIn('Test error', job.log_entries[0]['message']) class EnqueueTest(JobRunnerTestCase): From c40640af81b2e3d3469a589844288bc252f8c2c3 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 4 Mar 2026 13:47:54 -0500 Subject: [PATCH 009/104] Omit the system filepath north of the installation root --- netbox/netbox/jobs.py | 10 +++++++++- netbox/netbox/tests/test_jobs.py | 7 +++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/netbox/netbox/jobs.py b/netbox/netbox/jobs.py index 8942b831f..e685cfee8 100644 --- a/netbox/netbox/jobs.py +++ b/netbox/netbox/jobs.py @@ -1,7 +1,9 @@ import logging +import os import traceback from abc import ABC, abstractmethod from datetime import timedelta +from pathlib import Path from django.core.exceptions import ImproperlyConfigured from django.utils import timezone @@ -22,6 +24,11 @@ __all__ = ( 'system_job', ) +# The installation root, e.g. "/opt/netbox/". Used to strip absolute path +# prefixes from traceback file paths before recording them in the job log. +# jobs.py lives at /netbox/netbox/jobs.py, so parents[2] is the root. +_INSTALL_ROOT = str(Path(__file__).resolve().parents[2]) + os.sep + def system_job(interval): """ @@ -108,10 +115,11 @@ class JobRunner(ABC): job.terminate(status=JobStatusChoices.STATUS_FAILED) except Exception as e: + tb_str = traceback.format_exc().replace(_INSTALL_ROOT, '') tb_record = logging.makeLogRecord({ 'levelno': logging.ERROR, 'levelname': 'ERROR', - 'msg': traceback.format_exc(), + 'msg': tb_str, }) job.log(tb_record) job.terminate(status=JobStatusChoices.STATUS_ERRORED, error=repr(e)) diff --git a/netbox/netbox/tests/test_jobs.py b/netbox/netbox/tests/test_jobs.py index 93bae0e24..5bb073951 100644 --- a/netbox/netbox/tests/test_jobs.py +++ b/netbox/netbox/tests/test_jobs.py @@ -10,6 +10,7 @@ from core.models import DataSource, Job from utilities.testing import disable_warnings from ..jobs import * +from ..jobs import _INSTALL_ROOT class TestJobRunner(JobRunner): @@ -85,8 +86,10 @@ class JobRunnerTest(JobRunnerTestCase): self.assertEqual(job.error, repr(ErroredJobRunner.EXP)) self.assertEqual(len(job.log_entries), 1) self.assertEqual(job.log_entries[0]['level'], 'error') - self.assertIn('Traceback', job.log_entries[0]['message']) - self.assertIn('Test error', job.log_entries[0]['message']) + tb_message = job.log_entries[0]['message'] + self.assertIn('Traceback', tb_message) + self.assertIn('Test error', tb_message) + self.assertNotIn(_INSTALL_ROOT, tb_message) class EnqueueTest(JobRunnerTestCase): From 53ae164c75c2e251811cf025f5926dca920f5334 Mon Sep 17 00:00:00 2001 From: bctiemann Date: Thu, 5 Mar 2026 11:36:47 -0500 Subject: [PATCH 010/104] Fixes: #20984 - Django 6.0 (#21583) --- base_requirements.txt | 6 ++++-- netbox/extras/tests/test_models.py | 10 +++++++--- netbox/ipam/lookups.py | 4 +++- netbox/netbox/settings.py | 1 + requirements.txt | 4 ++-- 5 files changed, 17 insertions(+), 8 deletions(-) diff --git a/base_requirements.txt b/base_requirements.txt index 5c0fe3a75..afe67a7cd 100644 --- a/base_requirements.txt +++ b/base_requirements.txt @@ -4,7 +4,7 @@ colorama # The Python web framework on which NetBox is built # https://docs.djangoproject.com/en/stable/releases/ -Django==5.2.* +Django==6.0.* # Django middleware which permits cross-domain API requests # https://github.com/adamchainz/django-cors-headers/blob/main/CHANGELOG.rst @@ -35,7 +35,9 @@ django-pglocks # Prometheus metrics library for Django # https://github.com/korfuri/django-prometheus/blob/master/CHANGELOG.md -django-prometheus +# TODO: 2.4.1 is incompatible with Django>=6.0, but a fixed release is expected +# https://github.com/django-commons/django-prometheus/issues/494 +django-prometheus>=2.4.0,<2.5.0,!=2.4.1 # Django caching backend using Redis # https://github.com/jazzband/django-redis/blob/master/CHANGELOG.rst diff --git a/netbox/extras/tests/test_models.py b/netbox/extras/tests/test_models.py index e4cd4ff43..af673645e 100644 --- a/netbox/extras/tests/test_models.py +++ b/netbox/extras/tests/test_models.py @@ -677,15 +677,19 @@ class ConfigContextTest(TestCase): if hasattr(node, 'children'): for child in node.children: try: - if child.rhs.query.model is TaggedItem: - subqueries.append(child.rhs.query) + # In Django 6.0+, rhs is a Query directly; older Django wraps it in Subquery + rhs_query = getattr(child.rhs, 'query', child.rhs) + if rhs_query.model is TaggedItem: + subqueries.append(rhs_query) except AttributeError: traverse(child) traverse(where_node) return subqueries + # In Django 6.0+, the annotation is a Query directly; older Django wraps it in Subquery + annotation_query = getattr(config_annotation, 'query', config_annotation) # Find subqueries in the WHERE clause that should have DISTINCT - tag_subqueries = find_tag_subqueries(config_annotation.query.where) + tag_subqueries = find_tag_subqueries(annotation_query.where) distinct_subqueries = [sq for sq in tag_subqueries if sq.distinct] # Verify we found at least one DISTINCT subquery for tags diff --git a/netbox/ipam/lookups.py b/netbox/ipam/lookups.py index 45f6fd82f..693903f3f 100644 --- a/netbox/ipam/lookups.py +++ b/netbox/ipam/lookups.py @@ -94,9 +94,11 @@ class NetHost(Lookup): rhs, rhs_params = self.process_rhs(qn, connection) # Query parameters are automatically converted to IPNetwork objects, which are then turned to strings. We need # to omit the mask portion of the object's string representation to match PostgreSQL's HOST() function. + # Note: params may be tuples (Django 6.0+) or lists (older Django), so convert before mutating. + rhs_params = list(rhs_params) if rhs_params: rhs_params[0] = rhs_params[0].split('/')[0] - params = lhs_params + rhs_params + params = list(lhs_params) + rhs_params return f'HOST({lhs}) = {rhs}', params diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 90c9f8334..de741d9a3 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -435,6 +435,7 @@ INSTALLED_APPS = [ 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.humanize', + 'django.contrib.postgres', 'django.forms', 'corsheaders', 'debug_toolbar', diff --git a/requirements.txt b/requirements.txt index cf240f3c7..04879b308 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ colorama==0.4.6 -Django==5.2.11 +Django==6.0.3 django-cors-headers==4.9.0 django-debug-toolbar==6.2.0 django-filter==25.2 @@ -7,7 +7,7 @@ django-graphiql-debug-toolbar==0.2.0 django-htmx==1.27.0 django-mptt==0.18.0 django-pglocks==1.0.4 -django-prometheus==2.4.1 +django-prometheus==2.4.0 django-redis==6.0.0 django-rich==2.2.0 django-rq==3.2.2 From fd6e0e9784050db35cc0476e667e3a59317418dc Mon Sep 17 00:00:00 2001 From: Martin Hauser Date: Thu, 5 Mar 2026 22:05:07 +0100 Subject: [PATCH 011/104] feat(core): Retain create & last update changelog records Introduce a new configuration parameter, `CHANGELOG_RETAIN_CREATE_LAST_UPDATE`, to retain each object's create record and most recent update record when pruning expired changelog entries (per `CHANGELOG_RETENTION`). Update documentation, templates, and forms to reflect this change. Fixes #21409 --- docs/configuration/index.md | 1 + docs/configuration/miscellaneous.md | 21 ++++ netbox/core/forms/model_forms.py | 5 +- netbox/core/jobs.py | 49 ++++++-- netbox/core/tests/test_changelog.py | 105 +++++++++++++++++- .../management/commands/housekeeping.py | 58 ++++++++-- netbox/netbox/config/__init__.py | 1 + netbox/netbox/config/parameters.py | 26 +++-- netbox/templates/core/inc/config_data.html | 17 ++- netbox/templates/core/objectchange_list.html | 2 +- netbox/templates/extras/object_changelog.html | 2 +- 11 files changed, 252 insertions(+), 35 deletions(-) diff --git a/docs/configuration/index.md b/docs/configuration/index.md index e3e2d061c..0ae37b134 100644 --- a/docs/configuration/index.md +++ b/docs/configuration/index.md @@ -21,6 +21,7 @@ Some configuration parameters are primarily controlled via NetBox's admin interf * [`BANNER_BOTTOM`](./miscellaneous.md#banner_bottom) * [`BANNER_LOGIN`](./miscellaneous.md#banner_login) * [`BANNER_TOP`](./miscellaneous.md#banner_top) +* [`CHANGELOG_RETAIN_CREATE_LAST_UPDATE`](./miscellaneous.md#changelog_retain_create_last_update) * [`CHANGELOG_RETENTION`](./miscellaneous.md#changelog_retention) * [`CUSTOM_VALIDATORS`](./data-validation.md#custom_validators) * [`DEFAULT_USER_PREFERENCES`](./default-values.md#default_user_preferences) diff --git a/docs/configuration/miscellaneous.md b/docs/configuration/miscellaneous.md index 4ad3ba6ac..2de8a861d 100644 --- a/docs/configuration/miscellaneous.md +++ b/docs/configuration/miscellaneous.md @@ -73,6 +73,27 @@ This data enables the project maintainers to estimate how many NetBox deployment --- +## CHANGELOG_RETAIN_CREATE_LAST_UPDATE + +!!! tip "Dynamic Configuration Parameter" + +Default: `True` + +When pruning expired changelog entries (per `CHANGELOG_RETENTION`), retain each non-deleted object's original `create` +change record and its most recent `update` change record. If an object has a `delete` change record, its changelog +entries are pruned normally according to `CHANGELOG_RETENTION`. + +!!! note + For objects without a `delete` change record, the original `create` record and most recent `update` record are + exempt from pruning. All other changelog records (including intermediate `update` records and all `delete` records) + remain subject to pruning per `CHANGELOG_RETENTION`. + +!!! warning + This setting is enabled by default. Upgrading deployments that rely on complete pruning of expired changelog entries + should explicitly set `CHANGELOG_RETAIN_CREATE_LAST_UPDATE = False` to preserve the previous behavior. + +--- + ## CHANGELOG_RETENTION !!! tip "Dynamic Configuration Parameter" diff --git a/netbox/core/forms/model_forms.py b/netbox/core/forms/model_forms.py index 4f26d6024..c840827b5 100644 --- a/netbox/core/forms/model_forms.py +++ b/netbox/core/forms/model_forms.py @@ -165,9 +165,10 @@ class ConfigRevisionForm(forms.ModelForm, metaclass=ConfigFormMetaclass): FieldSet('PAGINATE_COUNT', 'MAX_PAGE_SIZE', name=_('Pagination')), FieldSet('CUSTOM_VALIDATORS', 'PROTECTION_RULES', name=_('Validation')), FieldSet('DEFAULT_USER_PREFERENCES', name=_('User Preferences')), + FieldSet('CHANGELOG_RETENTION', 'CHANGELOG_RETAIN_CREATE_LAST_UPDATE', name=_('Change Log')), FieldSet( - 'MAINTENANCE_MODE', 'COPILOT_ENABLED', 'GRAPHQL_ENABLED', 'CHANGELOG_RETENTION', 'JOB_RETENTION', - 'MAPS_URL', name=_('Miscellaneous'), + 'MAINTENANCE_MODE', 'COPILOT_ENABLED', 'GRAPHQL_ENABLED', 'JOB_RETENTION', 'MAPS_URL', + name=_('Miscellaneous'), ), FieldSet('comment', name=_('Config Revision')) ) diff --git a/netbox/core/jobs.py b/netbox/core/jobs.py index 5859a9989..46dc10d1c 100644 --- a/netbox/core/jobs.py +++ b/netbox/core/jobs.py @@ -5,6 +5,7 @@ from importlib import import_module import requests from django.conf import settings from django.core.cache import cache +from django.db.models import Exists, OuterRef, Subquery from django.utils import timezone from packaging import version @@ -14,7 +15,7 @@ from netbox.jobs import JobRunner, system_job from netbox.search.backends import search_backend from utilities.proxy import resolve_proxies -from .choices import DataSourceStatusChoices, JobIntervalChoices +from .choices import DataSourceStatusChoices, JobIntervalChoices, ObjectChangeActionChoices from .models import DataSource @@ -126,19 +127,51 @@ class SystemHousekeepingJob(JobRunner): """ Delete any ObjectChange records older than the configured changelog retention time (if any). """ - self.logger.info("Pruning old changelog entries...") + self.logger.info('Pruning old changelog entries...') config = Config() if not config.CHANGELOG_RETENTION: - self.logger.info("No retention period specified; skipping.") + self.logger.info('No retention period specified; skipping.') return cutoff = timezone.now() - timedelta(days=config.CHANGELOG_RETENTION) - self.logger.debug( - f"Changelog retention period: {config.CHANGELOG_RETENTION} days ({cutoff:%Y-%m-%d %H:%M:%S})" - ) + self.logger.debug(f'Changelog retention period: {config.CHANGELOG_RETENTION} days ({cutoff:%Y-%m-%d %H:%M:%S})') - count = ObjectChange.objects.filter(time__lt=cutoff).delete()[0] - self.logger.info(f"Deleted {count} expired changelog records") + expired_qs = ObjectChange.objects.filter(time__lt=cutoff) + + # When enabled, retain each object's original create record and most recent update record while pruning expired + # changelog entries. This applies only to objects without a delete record. + if config.CHANGELOG_RETAIN_CREATE_LAST_UPDATE: + self.logger.debug('Retaining changelog create records and last update records (excluding deleted objects)') + + deleted_exists = ObjectChange.objects.filter( + action=ObjectChangeActionChoices.ACTION_DELETE, + changed_object_type_id=OuterRef('changed_object_type_id'), + changed_object_id=OuterRef('changed_object_id'), + ) + + # Keep create records only where no delete exists for that object + create_pks_to_keep = ( + ObjectChange.objects.filter(action=ObjectChangeActionChoices.ACTION_CREATE) + .annotate(has_delete=Exists(deleted_exists)) + .filter(has_delete=False) + .values('pk') + ) + + # Keep the most recent update per object only where no delete exists for the object + latest_update_pks_to_keep = ( + ObjectChange.objects.filter(action=ObjectChangeActionChoices.ACTION_UPDATE) + .annotate(has_delete=Exists(deleted_exists)) + .filter(has_delete=False) + .order_by('changed_object_type_id', 'changed_object_id', '-time', '-pk') + .distinct('changed_object_type_id', 'changed_object_id') + .values('pk') + ) + + expired_qs = expired_qs.exclude(pk__in=Subquery(create_pks_to_keep)) + expired_qs = expired_qs.exclude(pk__in=Subquery(latest_update_pks_to_keep)) + + count = expired_qs.delete()[0] + self.logger.info(f'Deleted {count} expired changelog records') def delete_expired_jobs(self): """ diff --git a/netbox/core/tests/test_changelog.py b/netbox/core/tests/test_changelog.py index c3924bccb..dc9dbb2dc 100644 --- a/netbox/core/tests/test_changelog.py +++ b/netbox/core/tests/test_changelog.py @@ -1,9 +1,16 @@ +import logging +import uuid +from datetime import timedelta +from unittest.mock import patch + from django.contrib.contenttypes.models import ContentType -from django.test import override_settings +from django.test import TestCase, override_settings from django.urls import reverse +from django.utils import timezone from rest_framework import status from core.choices import ObjectChangeActionChoices +from core.jobs import SystemHousekeepingJob from core.models import ObjectChange, ObjectType from dcim.choices import InterfaceTypeChoices, ModuleStatusChoices, SiteStatusChoices from dcim.models import ( @@ -694,3 +701,99 @@ class ChangeLogAPITest(APITestCase): self.assertEqual(changes[3].changed_object_type, ContentType.objects.get_for_model(Module)) self.assertEqual(changes[3].changed_object_id, module.pk) self.assertEqual(changes[3].action, ObjectChangeActionChoices.ACTION_DELETE) + + +class ChangelogPruneRetentionTest(TestCase): + """Test suite for Changelog pruning retention settings.""" + + @staticmethod + def _make_oc(*, ct, obj_id, action, ts): + oc = ObjectChange.objects.create( + changed_object_type=ct, + changed_object_id=obj_id, + action=action, + user_name='test', + request_id=uuid.uuid4(), + object_repr=f'Object {obj_id}', + ) + ObjectChange.objects.filter(pk=oc.pk).update(time=ts) + return oc.pk + + @staticmethod + def _run_prune(*, retention_days, retain_create_last_update): + job = SystemHousekeepingJob.__new__(SystemHousekeepingJob) + job.logger = logging.getLogger('netbox.tests.changelog_prune') + + with patch('core.jobs.Config') as MockConfig: + cfg = MockConfig.return_value + cfg.CHANGELOG_RETENTION = retention_days + cfg.CHANGELOG_RETAIN_CREATE_LAST_UPDATE = retain_create_last_update + job.prune_changelog() + + def test_prune_retain_create_last_update_excludes_deleted_objects(self): + ct = ContentType.objects.get_for_model(Site) + + retention_days = 90 + now = timezone.now() + cutoff = now - timedelta(days=retention_days) + + expired_old = cutoff - timedelta(days=10) + expired_newer = cutoff - timedelta(days=1) + not_expired = cutoff + timedelta(days=1) + + # A) Not deleted: should keep CREATE + latest UPDATE, prune intermediate UPDATEs + a_create = self._make_oc(ct=ct, obj_id=1, action=ObjectChangeActionChoices.ACTION_CREATE, ts=expired_old) + a_update1 = self._make_oc(ct=ct, obj_id=1, action=ObjectChangeActionChoices.ACTION_UPDATE, ts=expired_old) + a_update2 = self._make_oc(ct=ct, obj_id=1, action=ObjectChangeActionChoices.ACTION_UPDATE, ts=expired_newer) + + # B) Deleted (all expired): should keep NOTHING + b_create = self._make_oc(ct=ct, obj_id=2, action=ObjectChangeActionChoices.ACTION_CREATE, ts=expired_old) + b_update = self._make_oc(ct=ct, obj_id=2, action=ObjectChangeActionChoices.ACTION_UPDATE, ts=expired_newer) + b_delete = self._make_oc(ct=ct, obj_id=2, action=ObjectChangeActionChoices.ACTION_DELETE, ts=expired_newer) + + # C) Deleted but delete is not expired: create/update expired should be pruned; delete remains + c_create = self._make_oc(ct=ct, obj_id=3, action=ObjectChangeActionChoices.ACTION_CREATE, ts=expired_old) + c_update = self._make_oc(ct=ct, obj_id=3, action=ObjectChangeActionChoices.ACTION_UPDATE, ts=expired_newer) + c_delete = self._make_oc(ct=ct, obj_id=3, action=ObjectChangeActionChoices.ACTION_DELETE, ts=not_expired) + + self._run_prune(retention_days=retention_days, retain_create_last_update=True) + + remaining = set(ObjectChange.objects.values_list('pk', flat=True)) + + # A) Not deleted -> create + latest update remain + self.assertIn(a_create, remaining) + self.assertIn(a_update2, remaining) + self.assertNotIn(a_update1, remaining) + + # B) Deleted (all expired) -> nothing remains + self.assertNotIn(b_create, remaining) + self.assertNotIn(b_update, remaining) + self.assertNotIn(b_delete, remaining) + + # C) Deleted, delete not expired -> delete remains, but create/update are pruned + self.assertNotIn(c_create, remaining) + self.assertNotIn(c_update, remaining) + self.assertIn(c_delete, remaining) + + def test_prune_disabled_deletes_all_expired(self): + ct = ContentType.objects.get_for_model(Site) + + retention_days = 90 + now = timezone.now() + cutoff = now - timedelta(days=retention_days) + expired = cutoff - timedelta(days=1) + not_expired = cutoff + timedelta(days=1) + + # expired create/update should be deleted when feature disabled + x_create = self._make_oc(ct=ct, obj_id=10, action=ObjectChangeActionChoices.ACTION_CREATE, ts=expired) + x_update = self._make_oc(ct=ct, obj_id=10, action=ObjectChangeActionChoices.ACTION_UPDATE, ts=expired) + + # non-expired delete should remain regardless + y_delete = self._make_oc(ct=ct, obj_id=11, action=ObjectChangeActionChoices.ACTION_DELETE, ts=not_expired) + + self._run_prune(retention_days=retention_days, retain_create_last_update=False) + + remaining = set(ObjectChange.objects.values_list('pk', flat=True)) + self.assertNotIn(x_create, remaining) + self.assertNotIn(x_update, remaining) + self.assertIn(y_delete, remaining) diff --git a/netbox/extras/management/commands/housekeeping.py b/netbox/extras/management/commands/housekeeping.py index 63a5e5b61..e68142ac3 100644 --- a/netbox/extras/management/commands/housekeeping.py +++ b/netbox/extras/management/commands/housekeeping.py @@ -6,9 +6,11 @@ import requests from django.conf import settings from django.core.cache import cache from django.core.management.base import BaseCommand +from django.db.models import Exists, OuterRef, Subquery from django.utils import timezone from packaging import version +from core.choices import ObjectChangeActionChoices from core.models import Job, ObjectChange from netbox.config import Config from utilities.proxy import resolve_proxies @@ -47,29 +49,63 @@ class Command(BaseCommand): # Delete expired ObjectChanges if options['verbosity']: - self.stdout.write("[*] Checking for expired changelog records") + self.stdout.write('[*] Checking for expired changelog records') if config.CHANGELOG_RETENTION: cutoff = timezone.now() - timedelta(days=config.CHANGELOG_RETENTION) if options['verbosity'] >= 2: - self.stdout.write(f"\tRetention period: {config.CHANGELOG_RETENTION} days") - self.stdout.write(f"\tCut-off time: {cutoff}") - expired_records = ObjectChange.objects.filter(time__lt=cutoff).count() + self.stdout.write(f'\tRetention period: {config.CHANGELOG_RETENTION} days') + self.stdout.write(f'\tCut-off time: {cutoff}') + + expired_qs = ObjectChange.objects.filter(time__lt=cutoff) + + # When enabled, retain each object's original create and most recent update record while pruning expired + # changelog entries. This applies only to objects without a delete record. + if config.CHANGELOG_RETAIN_CREATE_LAST_UPDATE: + if options['verbosity'] >= 2: + self.stdout.write('\tRetaining create & last update records for non-deleted objects') + + deleted_exists = ObjectChange.objects.filter( + action=ObjectChangeActionChoices.ACTION_DELETE, + changed_object_type_id=OuterRef('changed_object_type_id'), + changed_object_id=OuterRef('changed_object_id'), + ) + + # Keep create records only where no delete exists for that object + create_pks_to_keep = ( + ObjectChange.objects.filter(action=ObjectChangeActionChoices.ACTION_CREATE) + .annotate(has_delete=Exists(deleted_exists)) + .filter(has_delete=False) + .values('pk') + ) + + # Keep the most recent update per object only where no delete exists for the object + latest_update_pks_to_keep = ( + ObjectChange.objects.filter(action=ObjectChangeActionChoices.ACTION_UPDATE) + .annotate(has_delete=Exists(deleted_exists)) + .filter(has_delete=False) + .order_by('changed_object_type_id', 'changed_object_id', '-time', '-pk') + .distinct('changed_object_type_id', 'changed_object_id') + .values('pk') + ) + + expired_qs = expired_qs.exclude(pk__in=Subquery(create_pks_to_keep)) + expired_qs = expired_qs.exclude(pk__in=Subquery(latest_update_pks_to_keep)) + + expired_records = expired_qs.count() if expired_records: if options['verbosity']: self.stdout.write( - f"\tDeleting {expired_records} expired records... ", - self.style.WARNING, - ending="" + f'\tDeleting {expired_records} expired records... ', self.style.WARNING, ending='' ) self.stdout.flush() - ObjectChange.objects.filter(time__lt=cutoff).delete() + expired_qs.delete() if options['verbosity']: - self.stdout.write("Done.", self.style.SUCCESS) + self.stdout.write('Done.', self.style.SUCCESS) elif options['verbosity']: - self.stdout.write("\tNo expired records found.", self.style.SUCCESS) + self.stdout.write('\tNo expired records found.', self.style.SUCCESS) elif options['verbosity']: self.stdout.write( - f"\tSkipping: No retention period specified (CHANGELOG_RETENTION = {config.CHANGELOG_RETENTION})" + f'\tSkipping: No retention period specified (CHANGELOG_RETENTION = {config.CHANGELOG_RETENTION})' ) # Delete expired Jobs diff --git a/netbox/netbox/config/__init__.py b/netbox/netbox/config/__init__.py index 3c084949a..b6ca4f90c 100644 --- a/netbox/netbox/config/__init__.py +++ b/netbox/netbox/config/__init__.py @@ -10,6 +10,7 @@ from .parameters import PARAMS __all__ = ( 'PARAMS', + 'Config', 'ConfigItem', 'clear_config', 'get_config', diff --git a/netbox/netbox/config/parameters.py b/netbox/netbox/config/parameters.py index cc87b58bb..80081509a 100644 --- a/netbox/netbox/config/parameters.py +++ b/netbox/netbox/config/parameters.py @@ -175,6 +175,25 @@ PARAMS = ( field=forms.JSONField ), + # Change log + ConfigParam( + name='CHANGELOG_RETENTION', + label=_('Changelog retention'), + default=90, + description=_("Days to retain changelog history (set to zero for unlimited)"), + field=forms.IntegerField, + ), + ConfigParam( + name='CHANGELOG_RETAIN_CREATE_LAST_UPDATE', + label=_('Retain create & last update changelog records'), + default=True, + description=_( + "Retain each object's create record and most recent update record when pruning expired changelog entries " + "(excluding objects with a delete record)." + ), + field=forms.BooleanField, + ), + # Miscellaneous ConfigParam( name='MAINTENANCE_MODE', @@ -199,13 +218,6 @@ PARAMS = ( description=_("Enable the GraphQL API"), field=forms.BooleanField ), - ConfigParam( - name='CHANGELOG_RETENTION', - label=_('Changelog retention'), - default=90, - description=_("Days to retain changelog history (set to zero for unlimited)"), - field=forms.IntegerField - ), ConfigParam( name='JOB_RETENTION', label=_('Job result retention'), diff --git a/netbox/templates/core/inc/config_data.html b/netbox/templates/core/inc/config_data.html index cb32d7a88..964f9cee8 100644 --- a/netbox/templates/core/inc/config_data.html +++ b/netbox/templates/core/inc/config_data.html @@ -122,6 +122,19 @@ {% endif %} + {# Changelog #} + + {% trans "Change log" %} + + + {% trans "Changelog retention" %} + {{ config.CHANGELOG_RETENTION }} + + + {% trans "Changelog retain create & last update records" %} + {% checkmark config.CHANGELOG_RETAIN_CREATE_LAST_UPDATE %} + + {# Miscellaneous #} {% trans "Miscellaneous" %} @@ -137,10 +150,6 @@ {% trans "GraphQL enabled" %} {% checkmark config.GRAPHQL_ENABLED %} - - {% trans "Changelog retention" %} - {{ config.CHANGELOG_RETENTION }} - {% trans "Job retention" %} {{ config.JOB_RETENTION }} diff --git a/netbox/templates/core/objectchange_list.html b/netbox/templates/core/objectchange_list.html index ef11c0ef1..6231eb875 100644 --- a/netbox/templates/core/objectchange_list.html +++ b/netbox/templates/core/objectchange_list.html @@ -6,6 +6,6 @@ {% block content %} {{ block.super }}
- {% trans "Change log retention" %}: {% if config.CHANGELOG_RETENTION %}{{ config.CHANGELOG_RETENTION }} {% trans "days" %}{% else %}{% trans "Indefinite" %}{% endif %} + {% trans "Change log retention" %}: {% if config.CHANGELOG_RETENTION %}{{ config.CHANGELOG_RETENTION }} {% trans "days" %}{% if config.CHANGELOG_RETAIN_CREATE_LAST_UPDATE %} ({% trans "retaining create & last update records for non-deleted objects" %}){% endif %}{% else %}{% trans "Indefinite" %}{% endif %}
{% endblock content %} diff --git a/netbox/templates/extras/object_changelog.html b/netbox/templates/extras/object_changelog.html index 90855a750..30c822083 100644 --- a/netbox/templates/extras/object_changelog.html +++ b/netbox/templates/extras/object_changelog.html @@ -12,7 +12,7 @@
- {% trans "Change log retention" %}: {% if config.CHANGELOG_RETENTION %}{{ config.CHANGELOG_RETENTION }} {% trans "days" %}{% else %}{% trans "Indefinite" %}{% endif %} + {% trans "Change log retention" %}: {% if config.CHANGELOG_RETENTION %}{{ config.CHANGELOG_RETENTION }} {% trans "days" %}{% if config.CHANGELOG_RETAIN_CREATE_LAST_UPDATE %} ({% trans "retaining create & last update records for non-deleted objects" %}){% endif %}{% else %}{% trans "Indefinite" %}{% endif %}
From 6659bb3abe4bc51589977f03576f9d519c1f39be Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 6 Mar 2026 20:13:08 -0500 Subject: [PATCH 012/104] Closes #21363: Implement cursor-based pagination for the REST API (#21594) --- docs/integrations/rest-api.md | 45 +++++++++++- netbox/netbox/api/pagination.py | 112 +++++++++++++++++++++++++++-- netbox/netbox/settings.py | 2 +- netbox/netbox/tests/test_api.py | 35 ++++++++- netbox/utilities/tests/test_api.py | 110 ++++++++++++++++++++++++++++ 5 files changed, 293 insertions(+), 11 deletions(-) diff --git a/docs/integrations/rest-api.md b/docs/integrations/rest-api.md index bac984a08..74b421456 100644 --- a/docs/integrations/rest-api.md +++ b/docs/integrations/rest-api.md @@ -341,7 +341,7 @@ When retrieving devices and virtual machines via the REST API, each will include ## Pagination -API responses which contain a list of many objects will be paginated for efficiency. The root JSON object returned by a list endpoint contains the following attributes: +API responses which contain a list of many objects will be paginated for efficiency. NetBox employs offset-based pagination by default, which forms a page by skipping the number of objects indicated by the `offset` URL parameter. The root JSON object returned by a list endpoint contains the following attributes: * `count`: The total number of all objects matching the query * `next`: A hyperlink to the next page of results (if applicable) @@ -398,6 +398,49 @@ The maximum number of objects that can be returned is limited by the [`MAX_PAGE_ !!! warning Disabling the page size limit introduces a potential for very resource-intensive requests, since one API request can effectively retrieve an entire table from the database. +### Cursor-Based Pagination + +For large datasets, offset-based pagination can become inefficient because the database must scan all rows up to the offset. As an alternative, cursor-based pagination uses the `start` query parameter to filter results by primary key (PK), enabling efficient keyset pagination. + +To use cursor-based pagination, pass `start` (the minimum PK value) and `limit` (the page size): + +``` +http://netbox/api/dcim/devices/?start=0&limit=100 +``` + +This returns objects with an `id` greater than or equal to zero, ordered by PK, limited to 100 results. Below is an example showing an arbitrary `start` value. + +```json +{ + "count": null, + "next": "http://netbox/api/dcim/devices/?start=356&limit=100", + "previous": null, + "results": [ + { + "id": 109, + "name": "dist-router07", + ... + }, + ... + { + "id": 356, + "name": "acc-switch492", + ... + } + ] +} +``` + +To iterate through all results, use the `id` of the last object in each response plus one as the `start` value for the next request. Continue until `next` is null. + +!!! info + Some important differences from offset-based pagination: + + * `start` and `offset` are **mutually exclusive**; specifying both will result in a 400 error. + * Results are always ordered by primary key when using `start`. This is required to ensure deterministic behavior. + * `count` is always `null` in cursor mode, as counting all matching rows would partially negate its performance benefit. + * `previous` is always `null`: cursor-based pagination supports only forward navigation. + ## Interacting with Objects ### Retrieving Multiple Objects diff --git a/netbox/netbox/api/pagination.py b/netbox/netbox/api/pagination.py index 15fb49da8..eb0295662 100644 --- a/netbox/netbox/api/pagination.py +++ b/netbox/netbox/api/pagination.py @@ -1,18 +1,40 @@ from django.db.models import QuerySet +from django.utils.translation import gettext_lazy as _ +from rest_framework.exceptions import ValidationError from rest_framework.pagination import LimitOffsetPagination +from rest_framework.utils.urls import remove_query_param, replace_query_param from netbox.api.exceptions import QuerySetNotOrdered from netbox.config import get_config -class OptionalLimitOffsetPagination(LimitOffsetPagination): +class NetBoxPagination(LimitOffsetPagination): """ - Override the stock paginator to allow setting limit=0 to disable pagination for a request. This returns all objects - matching a query, but retains the same format as a paginated request. The limit can only be disabled if - MAX_PAGE_SIZE has been set to 0 or None. + Provides two mutually exclusive pagination mechanisms: offset-based and cursor-based. + + Offset-based pagination employs `offset` and (optionally) `limit` parameters to page through results following the + model's natural order. `offset` indicates the number of results to skip. This provides very human-friendly behavior, + but performance can suffer when querying very large data sets due the overhead required to determine the starting + point in the database. + + Cursor-based pagination employs `start` and (optionally) `limit` parameters to page through results as ordered by + the model's primary key (i.e. `id`). `start` indicates the numeric ID of the first object to return; `limit` + indicates the maximum number of objects to return beginning with the specified ID. Objects *must* be ordered by ID + to ensure pagination is consistent. This approach is less human-friendly but offers superior performance to + offset-based pagination. In cursor mode, `count` is omitted (null) for performance. + + Offset- and cursor-based pagination are mutually exclusive: Only `offset` _or_ `start` is permitted for a request. + + `limit` may be set to zero (`?limit=0`). This returns all objects matching a query, but retains the same format as + a paginated request. The limit can only be disabled if `MAX_PAGE_SIZE` has been set to 0 or None. """ + start_query_param = 'start' + def __init__(self): self.default_limit = get_config().PAGINATE_COUNT + self.start = None + self._page_length = 0 + self._last_pk = None def paginate_queryset(self, queryset, request, view=None): @@ -22,15 +44,42 @@ class OptionalLimitOffsetPagination(LimitOffsetPagination): "ordering has been applied to the queryset for this API endpoint." ) + self.start = self.get_start(request) + self.limit = self.get_limit(request) + self.request = request + + # Cursor-based pagination + if self.start is not None: + if self.offset_query_param in request.query_params: + raise ValidationError( + _("'{start_param}' and '{offset_param}' are mutually exclusive.").format( + start_param=self.start_query_param, + offset_param=self.offset_query_param, + ) + ) + if 'ordering' in request.query_params: + raise ValidationError(_("Ordering cannot be specified in conjunction with cursor-based pagination.")) + + self.count = None + self.offset = 0 + + queryset = queryset.filter(pk__gte=self.start).order_by('pk') + results = list(queryset[:self.limit]) if self.limit else list(queryset) + + self._page_length = len(results) + if results: + self._last_pk = results[-1].pk if hasattr(results[-1], 'pk') else results[-1]['pk'] + + return results + + # Offset-based pagination if isinstance(queryset, QuerySet): self.count = self.get_queryset_count(queryset) else: # We're dealing with an iterable, not a QuerySet self.count = len(queryset) - self.limit = self.get_limit(request) self.offset = self.get_offset(request) - self.request = request if self.limit and self.count > self.limit and self.template is not None: self.display_page_controls = True @@ -42,6 +91,25 @@ class OptionalLimitOffsetPagination(LimitOffsetPagination): return list(queryset[self.offset:self.offset + self.limit]) return list(queryset[self.offset:]) + def get_start(self, request): + try: + value = int(request.query_params[self.start_query_param]) + if value < 0: + raise ValidationError( + _("Invalid '{param}' parameter: must be a non-negative integer.").format( + param=self.start_query_param, + ) + ) + return value + except KeyError: + return None + except (ValueError, TypeError): + raise ValidationError( + _("Invalid '{param}' parameter: must be a non-negative integer.").format( + param=self.start_query_param, + ) + ) + def get_limit(self, request): max_limit = self.default_limit MAX_PAGE_SIZE = get_config().MAX_PAGE_SIZE @@ -75,6 +143,16 @@ class OptionalLimitOffsetPagination(LimitOffsetPagination): if not self.limit: return None + # Cursor mode + if self.start is not None: + if self._page_length < self.limit: + return None + url = self.request.build_absolute_uri() + url = replace_query_param(url, self.start_query_param, self._last_pk + 1) + url = replace_query_param(url, self.limit_query_param, self.limit) + url = remove_query_param(url, self.offset_query_param) + return url + return super().get_next_link() def get_previous_link(self): @@ -83,10 +161,30 @@ class OptionalLimitOffsetPagination(LimitOffsetPagination): if not self.limit: return None + # Cursor mode: forward-only + if self.start is not None: + return None + return super().get_previous_link() + def get_schema_operation_parameters(self, view): + parameters = super().get_schema_operation_parameters(view) + parameters.append({ + 'name': self.start_query_param, + 'required': False, + 'in': 'query', + 'description': ( + 'Cursor-based pagination: return results with pk >= start, ordered by pk. ' + 'Mutually exclusive with offset.' + ), + 'schema': { + 'type': 'integer', + }, + }) + return parameters -class StripCountAnnotationsPaginator(OptionalLimitOffsetPagination): + +class StripCountAnnotationsPaginator(NetBoxPagination): """ Strips the annotations on the queryset before getting the count to optimize pagination of complex queries. diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index de741d9a3..7b9a5567c 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -724,7 +724,7 @@ REST_FRAMEWORK = { 'rest_framework.filters.OrderingFilter', ), 'DEFAULT_METADATA_CLASS': 'netbox.api.metadata.BulkOperationMetadata', - 'DEFAULT_PAGINATION_CLASS': 'netbox.api.pagination.OptionalLimitOffsetPagination', + 'DEFAULT_PAGINATION_CLASS': 'netbox.api.pagination.NetBoxPagination', 'DEFAULT_PARSER_CLASSES': ( 'rest_framework.parsers.JSONParser', 'rest_framework.parsers.MultiPartParser', diff --git a/netbox/netbox/tests/test_api.py b/netbox/netbox/tests/test_api.py index 5cc2bf060..0cff906a4 100644 --- a/netbox/netbox/tests/test_api.py +++ b/netbox/netbox/tests/test_api.py @@ -2,10 +2,11 @@ import uuid from django.test import RequestFactory, TestCase from django.urls import reverse +from rest_framework.exceptions import ValidationError from rest_framework.request import Request from netbox.api.exceptions import QuerySetNotOrdered -from netbox.api.pagination import OptionalLimitOffsetPagination +from netbox.api.pagination import NetBoxPagination from users.models import Token from utilities.testing import APITestCase @@ -48,7 +49,7 @@ class AppTest(APITestCase): class OptionalLimitOffsetPaginationTest(TestCase): def setUp(self): - self.paginator = OptionalLimitOffsetPagination() + self.paginator = NetBoxPagination() self.factory = RequestFactory() def _make_drf_request(self, path='/', query_params=None): @@ -80,3 +81,33 @@ class OptionalLimitOffsetPaginationTest(TestCase): request = self._make_drf_request() self.paginator.paginate_queryset(iterable, request) # Should not raise exception + + def test_get_start_returns_none_when_absent(self): + """get_start() returns None when start param is not in the request""" + request = self._make_drf_request() + self.assertIsNone(self.paginator.get_start(request)) + + def test_get_start_returns_integer(self): + """get_start() returns an integer when start param is present""" + request = self._make_drf_request(query_params={'start': '42'}) + self.assertEqual(self.paginator.get_start(request), 42) + + def test_get_start_raises_for_negative(self): + """get_start() raises ValidationError for negative values""" + request = self._make_drf_request(query_params={'start': '-1'}) + with self.assertRaises(ValidationError): + self.paginator.get_start(request) + + def test_cursor_and_offset_conflict_raises_validation_error(self): + """paginate_queryset() raises ValidationError when both start and offset are specified""" + queryset = Token.objects.all().order_by('created') + request = self._make_drf_request(query_params={'start': '1', 'offset': '10'}) + with self.assertRaises(ValidationError): + self.paginator.paginate_queryset(queryset, request) + + def test_cursor_and_ordering_conflict_raises_validation_error(self): + """paginate_queryset() raises ValidationError when both start and ordering are specified""" + queryset = Token.objects.all().order_by('created') + request = self._make_drf_request(query_params={'start': '1', 'ordering': 'created'}) + with self.assertRaises(ValidationError): + self.paginator.paginate_queryset(queryset, request) diff --git a/netbox/utilities/tests/test_api.py b/netbox/utilities/tests/test_api.py index 885f71a73..290e98f1e 100644 --- a/netbox/utilities/tests/test_api.py +++ b/netbox/utilities/tests/test_api.py @@ -187,6 +187,116 @@ class APIPaginationTestCase(APITestCase): self.assertIsNone(response.data['previous']) self.assertEqual(len(response.data['results']), 100) + def test_cursor_pagination(self): + """Basic cursor pagination returns results ordered by PK with correct next link.""" + first_pk = Site.objects.order_by('pk').values_list('pk', flat=True).first() + response = self.client.get(f'{self.url}?start={first_pk}&limit=10', format='json', **self.header) + + self.assertHttpStatus(response, status.HTTP_200_OK) + self.assertIsNone(response.data['count']) + self.assertIsNone(response.data['previous']) + self.assertEqual(len(response.data['results']), 10) + + # Results should be ordered by PK + pks = [r['id'] for r in response.data['results']] + self.assertEqual(pks, sorted(pks)) + + # Next link should use start parameter + last_pk = pks[-1] + self.assertIn(f'start={last_pk + 1}', response.data['next']) + self.assertIn('limit=10', response.data['next']) + + def test_cursor_pagination_last_page(self): + """Cursor pagination returns null next link when fewer results than limit.""" + last_pk = Site.objects.order_by('pk').values_list('pk', flat=True).last() + response = self.client.get(f'{self.url}?start={last_pk}&limit=10', format='json', **self.header) + + self.assertHttpStatus(response, status.HTTP_200_OK) + self.assertEqual(len(response.data['results']), 1) + self.assertIsNone(response.data['next']) + self.assertIsNone(response.data['previous']) + + def test_cursor_pagination_no_results(self): + """Cursor pagination beyond all PKs returns empty results.""" + max_pk = Site.objects.order_by('pk').values_list('pk', flat=True).last() + response = self.client.get(f'{self.url}?start={max_pk + 1000}&limit=10', format='json', **self.header) + + self.assertHttpStatus(response, status.HTTP_200_OK) + self.assertEqual(len(response.data['results']), 0) + self.assertIsNone(response.data['next']) + + def test_cursor_and_offset_conflict(self): + """Specifying both start and offset returns a 400 error.""" + with disable_warnings('django.request'): + response = self.client.get(f'{self.url}?start=1&offset=10', format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) + + def test_cursor_and_ordering_conflict(self): + """Specifying both start and ordering returns a 400 error.""" + with disable_warnings('django.request'): + response = self.client.get(f'{self.url}?start=1&ordering=name', format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) + + def test_cursor_negative_start(self): + """Negative start value returns a 400 error.""" + with disable_warnings('django.request'): + response = self.client.get(f'{self.url}?start=-1', format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) + + def test_cursor_with_filters(self): + """Cursor pagination works alongside other query filters.""" + response = self.client.get(f'{self.url}?start=0&limit=10&name=Site 1', format='json', **self.header) + + self.assertHttpStatus(response, status.HTTP_200_OK) + self.assertIsNone(response.data['count']) + results = response.data['results'] + self.assertEqual(len(results), 1) + self.assertEqual(results[0]['name'], 'Site 1') + + def test_offset_multi_page_traversal(self): + """Traverse all 100 objects using offset pagination and verify complete, non-overlapping coverage.""" + collected_pks = [] + url = f'{self.url}?limit=10' + + while url: + response = self.client.get(url, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_200_OK) + self.assertEqual(response.data['count'], 100) + collected_pks.extend(r['id'] for r in response.data['results']) + url = response.data['next'] + + # Should have collected exactly 100 unique objects + self.assertEqual(len(set(collected_pks)), 100) + + def test_cursor_multi_page_traversal(self): + """Traverse all 100 objects using cursor pagination and verify complete, non-overlapping coverage.""" + collected_pks = [] + first_pk = Site.objects.order_by('pk').values_list('pk', flat=True).first() + url = f'{self.url}?start={first_pk}&limit=10' + + while url: + response = self.client.get(url, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_200_OK) + self.assertIsNone(response.data['count']) + self.assertIsNone(response.data['previous']) + + page_pks = [r['id'] for r in response.data['results']] + + # Each page should be ordered by PK + self.assertEqual(page_pks, sorted(page_pks)) + + # No overlap with previously collected PKs + self.assertFalse(set(page_pks) & set(collected_pks)) + + collected_pks.extend(page_pks) + url = response.data['next'] + + # Should have collected exactly 100 unique objects + self.assertEqual(len(set(collected_pks)), 100) + + # Full result set should be in PK order + self.assertEqual(collected_pks, sorted(collected_pks)) + class APIOrderingTestCase(APITestCase): user_permissions = ('dcim.view_site',) From 719effb548ef7fdc7a21acf43c1b0b26950c30a5 Mon Sep 17 00:00:00 2001 From: bctiemann Date: Mon, 9 Mar 2026 14:11:40 -0400 Subject: [PATCH 013/104] Fixes: #20123 - Add replicate_components and adopt_components write_only fields to ModuleSerializer (#21600) --- netbox/dcim/api/serializers_/devices.py | 132 +++++++++++++- netbox/dcim/tests/test_api.py | 232 ++++++++++++++++++++++++ 2 files changed, 363 insertions(+), 1 deletion(-) diff --git a/netbox/dcim/api/serializers_/devices.py b/netbox/dcim/api/serializers_/devices.py index 7be8e42c9..4da97ee78 100644 --- a/netbox/dcim/api/serializers_/devices.py +++ b/netbox/dcim/api/serializers_/devices.py @@ -6,7 +6,7 @@ from drf_spectacular.utils import extend_schema_field from rest_framework import serializers from dcim.choices import * -from dcim.constants import MACADDRESS_ASSIGNMENT_MODELS +from dcim.constants import MACADDRESS_ASSIGNMENT_MODELS, MODULE_TOKEN from dcim.models import Device, DeviceBay, MACAddress, Module, VirtualDeviceContext from extras.api.serializers_.configtemplates import ConfigTemplateSerializer from ipam.api.serializers_.ip import IPAddressSerializer @@ -150,15 +150,145 @@ class ModuleSerializer(PrimaryModelSerializer): module_bay = NestedModuleBaySerializer() module_type = ModuleTypeSerializer(nested=True) status = ChoiceField(choices=ModuleStatusChoices, required=False) + replicate_components = serializers.BooleanField( + required=False, + default=True, + write_only=True, + label=_('Replicate components'), + help_text=_('Automatically populate components associated with this module type (default: true)') + ) + adopt_components = serializers.BooleanField( + required=False, + default=False, + write_only=True, + label=_('Adopt components'), + help_text=_('Adopt already existing components') + ) class Meta: model = Module fields = [ 'id', 'url', 'display_url', 'display', 'device', 'module_bay', 'module_type', 'status', 'serial', 'asset_tag', 'description', 'owner', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', + 'replicate_components', 'adopt_components', ] brief_fields = ('id', 'url', 'display', 'device', 'module_bay', 'module_type', 'description') + def validate(self, data): + # When used as a nested serializer (e.g. as the `module` field on device component + # serializers), `data` is already a resolved Module instance — skip our custom logic. + if self.nested: + return super().validate(data) + + # Pop write-only transient fields before ValidatedModelSerializer tries to + # construct a Module instance for full_clean(); restore them afterwards. + replicate_components = data.pop('replicate_components', True) + adopt_components = data.pop('adopt_components', False) + data = super().validate(data) + + # For updates these fields are not meaningful; omit them from validated_data so that + # ModelSerializer.update() does not set unexpected attributes on the instance. + if self.instance: + return data + + # Always pass the flags to create() so it can set the correct private attributes. + data['replicate_components'] = replicate_components + data['adopt_components'] = adopt_components + + # Skip conflict checks when no component operations are requested. + if not replicate_components and not adopt_components: + return data + + device = data.get('device') + module_type = data.get('module_type') + module_bay = data.get('module_bay') + + # Required-field validation fires separately; skip here if any are missing. + if not all([device, module_type, module_bay]): + return data + + # Build module bay tree for MODULE_TOKEN placeholder resolution (outermost to innermost) + module_bays = [] + current_bay = module_bay + while current_bay: + module_bays.append(current_bay) + current_bay = current_bay.module.module_bay if current_bay.module else None + module_bays.reverse() + + for templates_attr, component_attr in [ + ('consoleporttemplates', 'consoleports'), + ('consoleserverporttemplates', 'consoleserverports'), + ('interfacetemplates', 'interfaces'), + ('powerporttemplates', 'powerports'), + ('poweroutlettemplates', 'poweroutlets'), + ('rearporttemplates', 'rearports'), + ('frontporttemplates', 'frontports'), + ]: + installed_components = { + component.name: component + for component in getattr(device, component_attr).all() + } + + for template in getattr(module_type, templates_attr).all(): + resolved_name = template.name + if MODULE_TOKEN in template.name: + if not module_bay.position: + raise serializers.ValidationError( + _("Cannot install module with placeholder values in a module bay with no position defined.") + ) + if template.name.count(MODULE_TOKEN) != len(module_bays): + raise serializers.ValidationError( + _( + "Cannot install module with placeholder values in a module bay tree {level} in tree " + "but {tokens} placeholders given." + ).format( + level=len(module_bays), tokens=template.name.count(MODULE_TOKEN) + ) + ) + for bay in module_bays: + resolved_name = resolved_name.replace(MODULE_TOKEN, bay.position, 1) + + existing_item = installed_components.get(resolved_name) + + if adopt_components and existing_item and existing_item.module: + raise serializers.ValidationError( + _("Cannot adopt {model} {name} as it already belongs to a module").format( + model=template.component_model.__name__, + name=resolved_name + ) + ) + + if not adopt_components and resolved_name in installed_components: + raise serializers.ValidationError( + _("A {model} named {name} already exists").format( + model=template.component_model.__name__, + name=resolved_name + ) + ) + + return data + + def create(self, validated_data): + replicate_components = validated_data.pop('replicate_components', True) + adopt_components = validated_data.pop('adopt_components', False) + + # Tags are handled after save; pop them here to pass to _save_tags() + tags = validated_data.pop('tags', None) + + # _adopt_components and _disable_replication must be set on the instance before + # save() is called, so we cannot delegate to super().create() here. + instance = self.Meta.model(**validated_data) + if adopt_components: + instance._adopt_components = True + if not replicate_components: + instance._disable_replication = True + instance.save() + + if tags is not None: + self._save_tags(instance, tags) + + return instance + class MACAddressSerializer(PrimaryModelSerializer): assigned_object_type = ContentTypeField( diff --git a/netbox/dcim/tests/test_api.py b/netbox/dcim/tests/test_api.py index 70c212849..f574507f1 100644 --- a/netbox/dcim/tests/test_api.py +++ b/netbox/dcim/tests/test_api.py @@ -1699,6 +1699,238 @@ class ModuleTest(APIViewTestCases.APIViewTestCase): }, ] + def test_replicate_components(self): + """ + Installing a module with replicate_components=True (the default) should create + components from the module type's templates on the parent device. + """ + self.add_permissions('dcim.add_module') + manufacturer = Manufacturer.objects.get(name='Generic') + device = create_test_device('Device for Replication Test') + module_type = ModuleType.objects.create(manufacturer=manufacturer, model='Replication Test Module Type') + InterfaceTemplate.objects.create(module_type=module_type, name='eth0', type='1000base-t') + module_bay = ModuleBay.objects.create(device=device, name='Replication Bay') + + url = reverse('dcim-api:module-list') + data = { + 'device': device.pk, + 'module_bay': module_bay.pk, + 'module_type': module_type.pk, + 'replicate_components': True, + } + response = self.client.post(url, data, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_201_CREATED) + self.assertTrue(device.interfaces.filter(name='eth0').exists()) + + def test_no_replicate_components(self): + """ + Installing a module with replicate_components=False should NOT create components + from the module type's templates. + """ + self.add_permissions('dcim.add_module') + manufacturer = Manufacturer.objects.get(name='Generic') + device = create_test_device('Device for No Replication Test') + module_type = ModuleType.objects.create(manufacturer=manufacturer, model='No Replication Test Module Type') + InterfaceTemplate.objects.create(module_type=module_type, name='eth0', type='1000base-t') + module_bay = ModuleBay.objects.create(device=device, name='No Replication Bay') + + url = reverse('dcim-api:module-list') + data = { + 'device': device.pk, + 'module_bay': module_bay.pk, + 'module_type': module_type.pk, + 'replicate_components': False, + } + response = self.client.post(url, data, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_201_CREATED) + self.assertFalse(device.interfaces.filter(name='eth0').exists()) + + def test_adopt_components(self): + """ + Installing a module with adopt_components=True should assign existing unattached + device components to the new module. + """ + self.add_permissions('dcim.add_module') + manufacturer = Manufacturer.objects.get(name='Generic') + device = create_test_device('Device for Adopt Test') + module_type = ModuleType.objects.create(manufacturer=manufacturer, model='Adopt Test Module Type') + InterfaceTemplate.objects.create(module_type=module_type, name='eth0', type='1000base-t') + module_bay = ModuleBay.objects.create(device=device, name='Adopt Bay') + existing_iface = Interface.objects.create(device=device, name='eth0', type='1000base-t') + + url = reverse('dcim-api:module-list') + data = { + 'device': device.pk, + 'module_bay': module_bay.pk, + 'module_type': module_type.pk, + 'adopt_components': True, + 'replicate_components': False, + } + response = self.client.post(url, data, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_201_CREATED) + existing_iface.refresh_from_db() + self.assertIsNotNone(existing_iface.module) + + def test_replicate_components_conflict(self): + """ + Installing a module with replicate_components=True when a component with the same name + already exists should return a validation error. + """ + self.add_permissions('dcim.add_module') + manufacturer = Manufacturer.objects.get(name='Generic') + device = create_test_device('Device for Conflict Test') + module_type = ModuleType.objects.create(manufacturer=manufacturer, model='Conflict Test Module Type') + InterfaceTemplate.objects.create(module_type=module_type, name='eth0', type='1000base-t') + module_bay = ModuleBay.objects.create(device=device, name='Conflict Bay') + Interface.objects.create(device=device, name='eth0', type='1000base-t') + + url = reverse('dcim-api:module-list') + data = { + 'device': device.pk, + 'module_bay': module_bay.pk, + 'module_type': module_type.pk, + 'replicate_components': True, + } + response = self.client.post(url, data, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) + + def test_adopt_components_already_owned(self): + """ + Installing a module with adopt_components=True when an existing component already + belongs to another module should return a validation error. + """ + self.add_permissions('dcim.add_module') + manufacturer = Manufacturer.objects.get(name='Generic') + device = create_test_device('Device for Adopt Owned Test') + owner_module_type = ModuleType.objects.create(manufacturer=manufacturer, model='Owner Module Type') + module_type = ModuleType.objects.create(manufacturer=manufacturer, model='Adopt Owned Test Module Type') + InterfaceTemplate.objects.create(module_type=module_type, name='eth0', type='1000base-t') + owner_bay = ModuleBay.objects.create(device=device, name='Owner Bay') + target_bay = ModuleBay.objects.create(device=device, name='Adopt Owned Bay') + + # Install a module that owns the interface + owner_module = Module.objects.create(device=device, module_bay=owner_bay, module_type=owner_module_type) + Interface.objects.create(device=device, name='eth0', type='1000base-t', module=owner_module) + + url = reverse('dcim-api:module-list') + data = { + 'device': device.pk, + 'module_bay': target_bay.pk, + 'module_type': module_type.pk, + 'adopt_components': True, + } + response = self.client.post(url, data, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) + + def test_patch_ignores_replicate_and_adopt(self): + """ + PATCH requests that include replicate_components or adopt_components should not + trigger component replication or adoption (these fields are create-only). + """ + self.add_permissions('dcim.change_module') + manufacturer = Manufacturer.objects.get(name='Generic') + device = create_test_device('Device for PATCH Test') + module_type = ModuleType.objects.create(manufacturer=manufacturer, model='PATCH Test Module Type') + InterfaceTemplate.objects.create(module_type=module_type, name='eth0', type='1000base-t') + module_bay = ModuleBay.objects.create(device=device, name='PATCH Bay') + # Create the module without replication so we can verify PATCH doesn't trigger it + module = Module(device=device, module_bay=module_bay, module_type=module_type) + module._disable_replication = True + module.save() + + url = reverse('dcim-api:module-detail', kwargs={'pk': module.pk}) + data = { + 'replicate_components': True, + 'adopt_components': True, + 'serial': 'PATCHED', + } + response = self.client.patch(url, data, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_200_OK) + self.assertEqual(response.data['serial'], 'PATCHED') + # No interfaces should have been created by the PATCH + self.assertFalse(device.interfaces.exists()) + + def test_adopt_and_replicate_components(self): + """ + Installing a module with both adopt_components=True and replicate_components=True + should adopt existing unowned components and create new components for templates + that have no matching existing component. + """ + self.add_permissions('dcim.add_module') + manufacturer = Manufacturer.objects.get(name='Generic') + device = create_test_device('Device for Adopt+Replicate Test') + module_type = ModuleType.objects.create(manufacturer=manufacturer, model='Adopt+Replicate Test Module Type') + InterfaceTemplate.objects.create(module_type=module_type, name='eth0', type='1000base-t') + InterfaceTemplate.objects.create(module_type=module_type, name='eth1', type='1000base-t') + module_bay = ModuleBay.objects.create(device=device, name='Adopt+Replicate Bay') + # eth0 already exists (unowned); eth1 does not + existing_iface = Interface.objects.create(device=device, name='eth0', type='1000base-t') + + url = reverse('dcim-api:module-list') + data = { + 'device': device.pk, + 'module_bay': module_bay.pk, + 'module_type': module_type.pk, + 'adopt_components': True, + 'replicate_components': True, + } + response = self.client.post(url, data, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_201_CREATED) + # eth0 should have been adopted (now owned by the new module) + existing_iface.refresh_from_db() + self.assertIsNotNone(existing_iface.module) + # eth1 should have been created + self.assertTrue(device.interfaces.filter(name='eth1').exists()) + + def test_module_token_no_position(self): + """ + Installing a module whose type has a template with a MODULE_TOKEN placeholder into a + module bay with no position defined should return a validation error. + """ + self.add_permissions('dcim.add_module') + manufacturer = Manufacturer.objects.get(name='Generic') + device = create_test_device('Device for Token No-Position Test') + module_type = ModuleType.objects.create(manufacturer=manufacturer, model='Token No-Position Module Type') + # Template name contains the MODULE_TOKEN placeholder + InterfaceTemplate.objects.create( + module_type=module_type, name=f'{MODULE_TOKEN}-eth0', type='1000base-t' + ) + # Module bay has no position + module_bay = ModuleBay.objects.create(device=device, name='No-Position Bay') + + url = reverse('dcim-api:module-list') + data = { + 'device': device.pk, + 'module_bay': module_bay.pk, + 'module_type': module_type.pk, + } + response = self.client.post(url, data, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) + + def test_module_token_depth_mismatch(self): + """ + Installing a module whose template name has more MODULE_TOKEN placeholders than the + depth of the module bay tree should return a validation error. + """ + self.add_permissions('dcim.add_module') + manufacturer = Manufacturer.objects.get(name='Generic') + device = create_test_device('Device for Token Depth Mismatch Test') + module_type = ModuleType.objects.create(manufacturer=manufacturer, model='Token Depth Mismatch Module Type') + # Template name has two placeholders but the bay is at depth 1 + InterfaceTemplate.objects.create( + module_type=module_type, name=f'{MODULE_TOKEN}-{MODULE_TOKEN}-eth0', type='1000base-t' + ) + module_bay = ModuleBay.objects.create(device=device, name='Depth 1 Bay', position='1') + + url = reverse('dcim-api:module-list') + data = { + 'device': device.pk, + 'module_bay': module_bay.pk, + 'module_type': module_type.pk, + } + response = self.client.post(url, data, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) + class ConsolePortTest(Mixins.ComponentTraceMixin, APIViewTestCases.APIViewTestCase): model = ConsolePort From e3d9fe622d7425379d9110be97806d5c801e253d Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Tue, 10 Mar 2026 08:00:28 -0700 Subject: [PATCH 014/104] Fix #17654: Add Role to ASN (#21582) Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Jason Novinger Closes #21571: Bump minimatch and markdown-it to resolve security alerts (#21573) --- docs/models/ipam/asn.md | 4 +++ netbox/ipam/api/serializers_/asns.py | 7 +++-- netbox/ipam/api/serializers_/roles.py | 6 +++-- netbox/ipam/filtersets.py | 12 +++++++++ netbox/ipam/forms/bulk_edit.py | 9 +++++-- netbox/ipam/forms/bulk_import.py | 9 ++++++- netbox/ipam/forms/filtersets.py | 7 ++++- netbox/ipam/forms/model_forms.py | 10 +++++-- netbox/ipam/graphql/filters.py | 2 ++ netbox/ipam/graphql/types.py | 1 + netbox/ipam/migrations/0087_add_asn_role.py | 21 +++++++++++++++ netbox/ipam/models/asns.py | 9 +++++++ netbox/ipam/search.py | 2 +- netbox/ipam/tables/asn.py | 10 ++++--- netbox/ipam/tables/ip.py | 11 +++++--- netbox/ipam/tests/test_api.py | 29 +++++++++++++++++---- netbox/ipam/tests/test_filtersets.py | 26 +++++++++++++----- netbox/ipam/tests/test_views.py | 26 +++++++++++------- netbox/ipam/views.py | 3 ++- netbox/templates/ipam/asn.html | 10 +++++++ 20 files changed, 176 insertions(+), 38 deletions(-) create mode 100644 netbox/ipam/migrations/0087_add_asn_role.py diff --git a/docs/models/ipam/asn.md b/docs/models/ipam/asn.md index 17fa5ebe3..33f8b13ed 100644 --- a/docs/models/ipam/asn.md +++ b/docs/models/ipam/asn.md @@ -14,6 +14,10 @@ The 16- or 32-bit AS number. The [Regional Internet Registry](./rir.md) or similar authority responsible for the allocation of this particular ASN. +### Role + +The user-defined functional [role](./role.md) assigned to this ASN. + ### Sites The [site(s)](../dcim/site.md) to which this ASN is assigned. diff --git a/netbox/ipam/api/serializers_/asns.py b/netbox/ipam/api/serializers_/asns.py index 334755734..c5c95bf19 100644 --- a/netbox/ipam/api/serializers_/asns.py +++ b/netbox/ipam/api/serializers_/asns.py @@ -6,6 +6,8 @@ from netbox.api.fields import RelatedObjectCountField, SerializedPKRelatedField from netbox.api.serializers import OrganizationalModelSerializer, PrimaryModelSerializer from tenancy.api.serializers_.tenants import TenantSerializer +from .roles import RoleSerializer + __all__ = ( 'ASNRangeSerializer', 'ASNSerializer', @@ -56,6 +58,7 @@ class ASNSiteSerializer(PrimaryModelSerializer): class ASNSerializer(PrimaryModelSerializer): rir = RIRSerializer(nested=True, required=False, allow_null=True) + role = RoleSerializer(nested=True, required=False, allow_null=True) tenant = TenantSerializer(nested=True, required=False, allow_null=True) sites = SerializedPKRelatedField( queryset=Site.objects.all(), @@ -72,8 +75,8 @@ class ASNSerializer(PrimaryModelSerializer): class Meta: model = ASN fields = [ - 'id', 'url', 'display_url', 'display', 'asn', 'rir', 'tenant', 'description', 'owner', 'comments', 'tags', - 'custom_fields', 'created', 'last_updated', 'site_count', 'provider_count', 'sites', + 'id', 'url', 'display_url', 'display', 'asn', 'rir', 'role', 'tenant', 'description', 'owner', 'comments', + 'tags', 'custom_fields', 'created', 'last_updated', 'site_count', 'provider_count', 'sites', ] brief_fields = ('id', 'url', 'display', 'asn', 'description') diff --git a/netbox/ipam/api/serializers_/roles.py b/netbox/ipam/api/serializers_/roles.py index 80a892659..8e62e4095 100644 --- a/netbox/ipam/api/serializers_/roles.py +++ b/netbox/ipam/api/serializers_/roles.py @@ -12,11 +12,13 @@ class RoleSerializer(OrganizationalModelSerializer): # Related object counts prefix_count = RelatedObjectCountField('prefixes') vlan_count = RelatedObjectCountField('vlans') + asn_count = RelatedObjectCountField('asns') class Meta: model = Role fields = [ 'id', 'url', 'display_url', 'display', 'name', 'slug', 'weight', 'description', 'owner', 'comments', 'tags', - 'custom_fields', 'created', 'last_updated', 'prefix_count', 'vlan_count', + 'custom_fields', 'created', 'last_updated', 'prefix_count', 'vlan_count', 'asn_count', ] - brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'prefix_count', 'vlan_count') + brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'prefix_count', 'vlan_count', + 'asn_count') diff --git a/netbox/ipam/filtersets.py b/netbox/ipam/filtersets.py index 56d2fb2b7..4e8ec5d88 100644 --- a/netbox/ipam/filtersets.py +++ b/netbox/ipam/filtersets.py @@ -289,6 +289,18 @@ class ASNFilterSet(PrimaryModelFilterSet, TenancyFilterSet): to_field_name='slug', label=_('Provider (slug)'), ) + role_id = django_filters.ModelMultipleChoiceFilter( + queryset=Role.objects.all(), + distinct=False, + label=_('Role (ID)'), + ) + role = django_filters.ModelMultipleChoiceFilter( + field_name='role__slug', + queryset=Role.objects.all(), + distinct=False, + to_field_name='slug', + label=_('Role (slug)'), + ) class Meta: model = ASN diff --git a/netbox/ipam/forms/bulk_edit.py b/netbox/ipam/forms/bulk_edit.py index 02e18bbe3..fd0afffa1 100644 --- a/netbox/ipam/forms/bulk_edit.py +++ b/netbox/ipam/forms/bulk_edit.py @@ -121,6 +121,11 @@ class ASNBulkEditForm(PrimaryModelBulkEditForm): required=False, label=_('RIR') ) + role = DynamicModelChoiceField( + queryset=Role.objects.all(), + required=False, + label=_('Role') + ) tenant = DynamicModelChoiceField( label=_('Tenant'), queryset=Tenant.objects.all(), @@ -129,9 +134,9 @@ class ASNBulkEditForm(PrimaryModelBulkEditForm): model = ASN fieldsets = ( - FieldSet('sites', 'rir', 'tenant', 'description'), + FieldSet('sites', 'rir', 'role', 'tenant', 'description'), ) - nullable_fields = ('tenant', 'description', 'comments') + nullable_fields = ('role', 'tenant', 'description', 'comments') class AggregateBulkEditForm(PrimaryModelBulkEditForm): diff --git a/netbox/ipam/forms/bulk_import.py b/netbox/ipam/forms/bulk_import.py index 7f9b5a00c..77aca5b83 100644 --- a/netbox/ipam/forms/bulk_import.py +++ b/netbox/ipam/forms/bulk_import.py @@ -138,6 +138,13 @@ class ASNImportForm(PrimaryModelImportForm): to_field_name='name', help_text=_('Assigned RIR') ) + role = CSVModelChoiceField( + label=_('Role'), + queryset=Role.objects.all(), + required=False, + to_field_name='name', + help_text=_('Functional role') + ) tenant = CSVModelChoiceField( label=_('Tenant'), queryset=Tenant.objects.all(), @@ -148,7 +155,7 @@ class ASNImportForm(PrimaryModelImportForm): class Meta: model = ASN - fields = ('asn', 'rir', 'tenant', 'description', 'owner', 'comments', 'tags') + fields = ('asn', 'rir', 'role', 'tenant', 'description', 'owner', 'comments', 'tags') class RoleImportForm(OrganizationalModelImportForm): diff --git a/netbox/ipam/forms/filtersets.py b/netbox/ipam/forms/filtersets.py index 0bfbd53a4..dbb9765a7 100644 --- a/netbox/ipam/forms/filtersets.py +++ b/netbox/ipam/forms/filtersets.py @@ -151,7 +151,7 @@ class ASNFilterForm(TenancyFilterForm, PrimaryModelFilterSetForm): model = ASN fieldsets = ( FieldSet('q', 'filter_id', 'tag'), - FieldSet('rir_id', 'site_group_id', 'site_id', name=_('Assignment')), + FieldSet('rir_id', 'role_id', 'site_group_id', 'site_id', name=_('Assignment')), FieldSet('tenant_group_id', 'tenant_id', name=_('Tenant')), FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), ) @@ -160,6 +160,11 @@ class ASNFilterForm(TenancyFilterForm, PrimaryModelFilterSetForm): required=False, label=_('RIR') ) + role_id = DynamicModelMultipleChoiceField( + queryset=Role.objects.all(), + required=False, + label=_('Role') + ) site_group_id = DynamicModelMultipleChoiceField( queryset=SiteGroup.objects.all(), required=False, diff --git a/netbox/ipam/forms/model_forms.py b/netbox/ipam/forms/model_forms.py index 1bdcff2d8..3748f2901 100644 --- a/netbox/ipam/forms/model_forms.py +++ b/netbox/ipam/forms/model_forms.py @@ -152,6 +152,12 @@ class ASNForm(TenancyForm, PrimaryModelForm): label=_('RIR'), quick_add=True ) + role = DynamicModelChoiceField( + queryset=Role.objects.all(), + label=_('Role'), + required=False, + quick_add=True + ) sites = DynamicModelMultipleChoiceField( queryset=Site.objects.all(), label=_('Sites'), @@ -159,14 +165,14 @@ class ASNForm(TenancyForm, PrimaryModelForm): ) fieldsets = ( - FieldSet('asn', 'rir', 'sites', 'description', 'tags', name=_('ASN')), + FieldSet('asn', 'rir', 'role', 'sites', 'description', 'tags', name=_('ASN')), FieldSet('tenant_group', 'tenant', name=_('Tenancy')), ) class Meta: model = ASN fields = [ - 'asn', 'rir', 'sites', 'tenant_group', 'tenant', 'description', 'owner', 'comments', 'tags' + 'asn', 'rir', 'role', 'sites', 'tenant_group', 'tenant', 'description', 'owner', 'comments', 'tags' ] widgets = { 'date_added': DatePicker(), diff --git a/netbox/ipam/graphql/filters.py b/netbox/ipam/graphql/filters.py index 6126c3c45..664e6be65 100644 --- a/netbox/ipam/graphql/filters.py +++ b/netbox/ipam/graphql/filters.py @@ -57,6 +57,8 @@ __all__ = ( class ASNFilter(TenancyFilterMixin, PrimaryModelFilter): rir: Annotated['RIRFilter', strawberry.lazy('ipam.graphql.filters')] | None = strawberry_django.filter_field() rir_id: ID | None = strawberry_django.filter_field() + role: Annotated['RoleFilter', strawberry.lazy('ipam.graphql.filters')] | None = strawberry_django.filter_field() + role_id: ID | None = strawberry_django.filter_field() asn: Annotated['BigIntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = ( strawberry_django.filter_field() ) diff --git a/netbox/ipam/graphql/types.py b/netbox/ipam/graphql/types.py index 98aa91939..1c281cedf 100644 --- a/netbox/ipam/graphql/types.py +++ b/netbox/ipam/graphql/types.py @@ -77,6 +77,7 @@ class BaseIPAddressFamilyType: class ASNType(ContactsMixin, PrimaryObjectType): asn: BigInt rir: Annotated["RIRType", strawberry.lazy('ipam.graphql.types')] | None + role: Annotated["RoleType", strawberry.lazy('ipam.graphql.types')] | None tenant: Annotated["TenantType", strawberry.lazy('tenancy.graphql.types')] | None sites: list[SiteType] diff --git a/netbox/ipam/migrations/0087_add_asn_role.py b/netbox/ipam/migrations/0087_add_asn_role.py new file mode 100644 index 000000000..890a8a40d --- /dev/null +++ b/netbox/ipam/migrations/0087_add_asn_role.py @@ -0,0 +1,21 @@ +# Generated by Django 5.2.11 on 2026-03-04 19:14 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ipam', '0086_gfk_indexes'), + ] + + operations = [ + migrations.AddField( + model_name='asn', + name='role', + field=models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='asns', to='ipam.role' + ), + ), + ] diff --git a/netbox/ipam/models/asns.py b/netbox/ipam/models/asns.py index 1b4459921..709314944 100644 --- a/netbox/ipam/models/asns.py +++ b/netbox/ipam/models/asns.py @@ -137,6 +137,15 @@ class ASN(ContactsMixin, PrimaryModel): verbose_name=_('ASN'), help_text=_('16- or 32-bit autonomous system number') ) + role = models.ForeignKey( + to='ipam.Role', + on_delete=models.SET_NULL, + related_name='asns', + blank=True, + null=True, + verbose_name=_('role'), + help_text=_("The primary function of this ASN") + ) tenant = models.ForeignKey( to='tenancy.Tenant', on_delete=models.PROTECT, diff --git a/netbox/ipam/search.py b/netbox/ipam/search.py index 17259071f..ea0d41db3 100644 --- a/netbox/ipam/search.py +++ b/netbox/ipam/search.py @@ -23,7 +23,7 @@ class ASNIndex(SearchIndex): ('prefixed_name', 110), ('description', 500), ) - display_attrs = ('rir', 'tenant', 'description') + display_attrs = ('rir', 'role', 'tenant', 'description') @register_search diff --git a/netbox/ipam/tables/asn.py b/netbox/ipam/tables/asn.py index 94e80bfdf..b8f2e4b60 100644 --- a/netbox/ipam/tables/asn.py +++ b/netbox/ipam/tables/asn.py @@ -71,6 +71,10 @@ class ASNTable(TenancyColumnsMixin, ContactsColumnMixin, PrimaryModelTable): url_params={'asn_id': 'pk'}, verbose_name=_('Provider Count') ) + role = tables.Column( + verbose_name=_('Role'), + linkify=True + ) sites = columns.ManyToManyColumn( linkify_item=True, verbose_name=_('Sites') @@ -82,9 +86,9 @@ class ASNTable(TenancyColumnsMixin, ContactsColumnMixin, PrimaryModelTable): class Meta(PrimaryModelTable.Meta): model = ASN fields = ( - 'pk', 'asn', 'asn_asdot', 'rir', 'site_count', 'provider_count', 'tenant', 'tenant_group', 'description', - 'contacts', 'comments', 'sites', 'tags', 'created', 'last_updated', 'actions', + 'pk', 'asn', 'asn_asdot', 'rir', 'role', 'site_count', 'provider_count', 'tenant', 'tenant_group', + 'description', 'contacts', 'comments', 'sites', 'tags', 'created', 'last_updated', 'actions', ) default_columns = ( - 'pk', 'asn', 'rir', 'site_count', 'provider_count', 'sites', 'description', 'tenant', + 'pk', 'asn', 'rir', 'role', 'site_count', 'provider_count', 'sites', 'description', 'tenant', ) diff --git a/netbox/ipam/tables/ip.py b/netbox/ipam/tables/ip.py index ee923c3d8..56f2771f0 100644 --- a/netbox/ipam/tables/ip.py +++ b/netbox/ipam/tables/ip.py @@ -120,6 +120,11 @@ class RoleTable(OrganizationalModelTable): url_params={'role_id': 'pk'}, verbose_name=_('VLANs') ) + asn_count = columns.LinkedCountColumn( + viewname='ipam:asn_list', + url_params={'role_id': 'pk'}, + verbose_name=_('ASNs') + ) tags = columns.TagColumn( url_name='ipam:role_list' ) @@ -127,10 +132,10 @@ class RoleTable(OrganizationalModelTable): class Meta(OrganizationalModelTable.Meta): model = Role fields = ( - 'pk', 'id', 'name', 'slug', 'prefix_count', 'iprange_count', 'vlan_count', 'description', 'weight', - 'comments', 'tags', 'created', 'last_updated', 'actions', + 'pk', 'id', 'name', 'slug', 'prefix_count', 'iprange_count', 'vlan_count', 'asn_count', 'description', + 'weight', 'comments', 'tags', 'created', 'last_updated', 'actions', ) - default_columns = ('pk', 'name', 'prefix_count', 'iprange_count', 'vlan_count', 'description') + default_columns = ('pk', 'name', 'prefix_count', 'iprange_count', 'vlan_count', 'asn_count', 'description') # diff --git a/netbox/ipam/tests/test_api.py b/netbox/ipam/tests/test_api.py index 3a75347ae..87bfa54fb 100644 --- a/netbox/ipam/tests/test_api.py +++ b/netbox/ipam/tests/test_api.py @@ -151,6 +151,12 @@ class ASNTest(APIViewTestCases.APIViewTestCase): ) RIR.objects.bulk_create(rirs) + roles = ( + Role(name='Role 1', slug='role-1'), + Role(name='Role 2', slug='role-2'), + ) + Role.objects.bulk_create(roles) + sites = ( Site(name='Site 1', slug='site-1'), Site(name='Site 2', slug='site-2') @@ -164,10 +170,10 @@ class ASNTest(APIViewTestCases.APIViewTestCase): Tenant.objects.bulk_create(tenants) asns = ( - ASN(asn=65000, rir=rirs[0], tenant=tenants[0]), - ASN(asn=65001, rir=rirs[0], tenant=tenants[1]), - ASN(asn=4200000000, rir=rirs[1], tenant=tenants[0]), - ASN(asn=4200000001, rir=rirs[1], tenant=tenants[1]), + ASN(asn=65000, rir=rirs[0], role=roles[0], tenant=tenants[0]), + ASN(asn=65001, rir=rirs[0], role=roles[0], tenant=tenants[1]), + ASN(asn=4200000000, rir=rirs[1], role=roles[1], tenant=tenants[0]), + ASN(asn=4200000001, rir=rirs[1], role=roles[1], tenant=tenants[1]), ) ASN.objects.bulk_create(asns) @@ -180,10 +186,12 @@ class ASNTest(APIViewTestCases.APIViewTestCase): { 'asn': 64512, 'rir': rirs[0].pk, + 'role': roles[0].pk, }, { 'asn': 65002, 'rir': rirs[0].pk, + 'role': roles[1].pk, }, { 'asn': 4200000002, @@ -375,7 +383,7 @@ class AggregateTest(APIViewTestCases.APIViewTestCase): class RoleTest(APIViewTestCases.APIViewTestCase): model = Role - brief_fields = ['description', 'display', 'id', 'name', 'prefix_count', 'slug', 'url', 'vlan_count'] + brief_fields = ['asn_count', 'description', 'display', 'id', 'name', 'prefix_count', 'slug', 'url', 'vlan_count'] create_data = [ { 'name': 'Role 4', @@ -404,6 +412,17 @@ class RoleTest(APIViewTestCases.APIViewTestCase): ) Role.objects.bulk_create(roles) + rirs = ( + RIR(name='RIR 1', slug='rir-1', is_private=True), + ) + RIR.objects.bulk_create(rirs) + + asns = ( + ASN(asn=65000, rir=rirs[0], role=roles[0]), + ASN(asn=65001, rir=rirs[0], role=roles[0]), + ) + ASN.objects.bulk_create(asns) + class PrefixTest(APIViewTestCases.APIViewTestCase): model = Prefix diff --git a/netbox/ipam/tests/test_filtersets.py b/netbox/ipam/tests/test_filtersets.py index c77b05dcf..68b61142a 100644 --- a/netbox/ipam/tests/test_filtersets.py +++ b/netbox/ipam/tests/test_filtersets.py @@ -114,6 +114,13 @@ class ASNTestCase(TestCase, ChangeLoggedFilterSetTests): ] RIR.objects.bulk_create(rirs) + roles = [ + Role(name='Role 1', slug='role-1'), + Role(name='Role 2', slug='role-2'), + Role(name='Role 3', slug='role-3'), + ] + Role.objects.bulk_create(roles) + tenants = [ Tenant(name='Tenant 1', slug='tenant-1'), Tenant(name='Tenant 2', slug='tenant-2'), @@ -124,12 +131,12 @@ class ASNTestCase(TestCase, ChangeLoggedFilterSetTests): Tenant.objects.bulk_create(tenants) asns = ( - ASN(asn=65001, rir=rirs[0], tenant=tenants[0], description='foobar1'), - ASN(asn=65002, rir=rirs[1], tenant=tenants[1], description='foobar2'), - ASN(asn=65003, rir=rirs[2], tenant=tenants[2], description='foobar3'), - ASN(asn=4200000000, rir=rirs[0], tenant=tenants[0]), - ASN(asn=4200000001, rir=rirs[1], tenant=tenants[1]), - ASN(asn=4200000002, rir=rirs[2], tenant=tenants[2]), + ASN(asn=65001, rir=rirs[0], role=roles[0], tenant=tenants[0], description='foobar1'), + ASN(asn=65002, rir=rirs[1], role=roles[1], tenant=tenants[1], description='foobar2'), + ASN(asn=65003, rir=rirs[2], role=roles[2], tenant=tenants[2], description='foobar3'), + ASN(asn=4200000000, rir=rirs[0], role=roles[0], tenant=tenants[0]), + ASN(asn=4200000001, rir=rirs[1], role=roles[1], tenant=tenants[1]), + ASN(asn=4200000002, rir=rirs[2], role=roles[2], tenant=tenants[2]), ) ASN.objects.bulk_create(asns) @@ -186,6 +193,13 @@ class ASNTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'rir': [rirs[0].slug, rirs[1].slug]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) + def test_role(self): + roles = Role.objects.all()[:2] + params = {'role_id': [roles[0].pk, roles[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) + params = {'role': [roles[0].slug, roles[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) + def test_site_group(self): site_groups = SiteGroup.objects.all()[:2] params = {'site_group_id': [site_groups[0].pk, site_groups[1].pk]} diff --git a/netbox/ipam/tests/test_views.py b/netbox/ipam/tests/test_views.py index e61287d76..5154397bb 100644 --- a/netbox/ipam/tests/test_views.py +++ b/netbox/ipam/tests/test_views.py @@ -84,6 +84,12 @@ class ASNTestCase(ViewTestCases.PrimaryObjectViewTestCase): ] RIR.objects.bulk_create(rirs) + roles = ( + Role(name='Role 1', slug='role-1'), + Role(name='Role 2', slug='role-2'), + ) + Role.objects.bulk_create(roles) + sites = ( Site(name='Site 1', slug='site-1'), Site(name='Site 2', slug='site-2') @@ -97,10 +103,10 @@ class ASNTestCase(ViewTestCases.PrimaryObjectViewTestCase): Tenant.objects.bulk_create(tenants) asns = ( - ASN(asn=65001, rir=rirs[0], tenant=tenants[0]), - ASN(asn=65002, rir=rirs[1], tenant=tenants[1]), - ASN(asn=4200000001, rir=rirs[0], tenant=tenants[0]), - ASN(asn=4200000002, rir=rirs[1], tenant=tenants[1]), + ASN(asn=65001, rir=rirs[0], role=roles[0], tenant=tenants[0]), + ASN(asn=65002, rir=rirs[1], role=roles[1], tenant=tenants[1]), + ASN(asn=4200000001, rir=rirs[0], role=roles[0], tenant=tenants[0]), + ASN(asn=4200000002, rir=rirs[1], role=roles[1], tenant=tenants[1]), ) ASN.objects.bulk_create(asns) @@ -114,6 +120,7 @@ class ASNTestCase(ViewTestCases.PrimaryObjectViewTestCase): cls.form_data = { 'asn': 65000, 'rir': rirs[0].pk, + 'role': roles[0].pk, 'tenant': tenants[0].pk, 'site': sites[0].pk, 'description': 'A new ASN', @@ -121,11 +128,11 @@ class ASNTestCase(ViewTestCases.PrimaryObjectViewTestCase): } cls.csv_data = ( - "asn,rir", - "65003,RIR 1", - "65004,RIR 2", - "4200000003,RIR 1", - "4200000004,RIR 2", + "asn,rir,role", + f"65003,RIR 1,{roles[0].name}", + f"65004,RIR 2,{roles[1].name}", + f"4200000003,RIR 1,{roles[0].name}", + f"4200000004,RIR 2,{roles[1].name}", ) cls.csv_update_data = ( @@ -137,6 +144,7 @@ class ASNTestCase(ViewTestCases.PrimaryObjectViewTestCase): cls.bulk_edit_data = { 'rir': rirs[1].pk, + 'role': roles[1].pk, 'description': 'Next description', } diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index cbea4f318..6ceb0c53a 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -496,7 +496,8 @@ class RoleListView(generic.ObjectListView): queryset = Role.objects.annotate( prefix_count=count_related(Prefix, 'role'), iprange_count=count_related(IPRange, 'role'), - vlan_count=count_related(VLAN, 'role') + vlan_count=count_related(VLAN, 'role'), + asn_count=count_related(ASN, 'role') ) filterset = filtersets.RoleFilterSet filterset_form = forms.RoleFilterForm diff --git a/netbox/templates/ipam/asn.html b/netbox/templates/ipam/asn.html index 3a54e453b..26c6e0c3c 100644 --- a/netbox/templates/ipam/asn.html +++ b/netbox/templates/ipam/asn.html @@ -29,6 +29,16 @@ {{ object.rir }} + + {% trans "Role" %} + + {% if object.role %} + {{ object.role }} + {% else %} + {{ ''|placeholder }} + {% endif %} + + {% trans "Tenant" %} From c384cec453d283048a28fd113fca64490cf8f3aa Mon Sep 17 00:00:00 2001 From: bctiemann Date: Tue, 10 Mar 2026 11:10:40 -0400 Subject: [PATCH 015/104] Closes #21331: Emit deprecation warning on use of querystring template tag (#21476) --- netbox/utilities/templatetags/helpers.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/netbox/utilities/templatetags/helpers.py b/netbox/utilities/templatetags/helpers.py index 0a77b9cab..b5f860456 100644 --- a/netbox/utilities/templatetags/helpers.py +++ b/netbox/utilities/templatetags/helpers.py @@ -1,4 +1,5 @@ import json +import warnings from typing import Any from urllib.parse import quote @@ -363,6 +364,11 @@ def querystring(request, **kwargs): """ Append or update the page number in a querystring. """ + warnings.warn( + 'The querystring template tag is deprecated and will be removed in a future release. Use ' + 'the built-in Django querystring tag instead.', + category=FutureWarning, + ) querydict = request.GET.copy() for k, v in kwargs.items(): if v is not None: From e2665ef211167e3e58ea08f62e6fe5c9f18d1122 Mon Sep 17 00:00:00 2001 From: Martin Hauser Date: Tue, 10 Mar 2026 16:19:12 +0100 Subject: [PATCH 016/104] Closes #20961: Introduce RackGroup for physical rack placement (#21624) Fixes #20961 --- docs/models/dcim/rack.md | 6 +- docs/models/dcim/rackgroup.md | 15 ++++ mkdocs.yml | 1 + netbox/dcim/api/serializers_/racks.py | 32 ++++++-- netbox/dcim/api/urls.py | 1 + netbox/dcim/api/views.py | 11 +++ netbox/dcim/filtersets.py | 34 +++++++++ netbox/dcim/forms/bulk_edit.py | 20 ++++- netbox/dcim/forms/bulk_import.py | 23 +++++- netbox/dcim/forms/filtersets.py | 29 ++++++- netbox/dcim/forms/model_forms.py | 22 +++++- netbox/dcim/graphql/filters.py | 10 +++ netbox/dcim/graphql/schema.py | 3 + netbox/dcim/graphql/types.py | 13 ++++ netbox/dcim/migrations/0227_rack_group.py | 57 ++++++++++++++ netbox/dcim/models/racks.py | 30 +++++++- netbox/dcim/search.py | 12 +++ netbox/dcim/tables/racks.py | 45 +++++++++-- netbox/dcim/tests/test_api.py | 47 +++++++++++- netbox/dcim/tests/test_filtersets.py | 92 +++++++++++++++++++---- netbox/dcim/tests/test_views.py | 61 +++++++++++++-- netbox/dcim/ui/panels.py | 1 + netbox/dcim/urls.py | 3 + netbox/dcim/views.py | 81 +++++++++++++++++++- netbox/extras/tests/test_filtersets.py | 1 + netbox/ipam/constants.py | 2 +- netbox/ipam/filtersets.py | 3 + netbox/ipam/forms/filtersets.py | 9 ++- netbox/netbox/navigation/menu.py | 8 +- netbox/templates/dcim/rackgroup.html | 10 +++ 30 files changed, 628 insertions(+), 54 deletions(-) create mode 100644 docs/models/dcim/rackgroup.md create mode 100644 netbox/dcim/migrations/0227_rack_group.py create mode 100644 netbox/templates/dcim/rackgroup.html diff --git a/docs/models/dcim/rack.md b/docs/models/dcim/rack.md index d610f6368..52df4aaf8 100644 --- a/docs/models/dcim/rack.md +++ b/docs/models/dcim/rack.md @@ -1,6 +1,6 @@ # Racks -The rack model represents a physical two- or four-post equipment rack in which [devices](./device.md) can be installed. Each rack must be assigned to a [site](./site.md), and may optionally be assigned to a [location](./location.md) within that site. Racks can also be organized by user-defined functional roles. The name and facility ID of each rack within a location must be unique. +The rack model represents a physical two- or four-post equipment rack in which [devices](./device.md) can be installed. Each rack must be assigned to a [site](./site.md), and may optionally be assigned to a [location](./location.md) within that site. Racks can also be organized by user-defined functional roles or by [rack groups](./rackgroup.md). The name and facility ID of each rack within a location must be unique. Rack height is measured in *rack units* (U); racks are commonly between 42U and 48U tall, but NetBox allows you to define racks of arbitrary height. A toggle is provided to indicate whether rack units are in ascending (from the ground up) or descending order. @@ -16,6 +16,10 @@ The [site](./site.md) to which the rack is assigned. The [location](./location.md) within a site where the rack has been installed (optional). +### Rack Group + +The [group](./rackgroup.md) used to organize racks by physical placement (optional). + ### Name The rack's name or identifier. Must be unique to the rack's location, if assigned. diff --git a/docs/models/dcim/rackgroup.md b/docs/models/dcim/rackgroup.md new file mode 100644 index 000000000..13b3f39ab --- /dev/null +++ b/docs/models/dcim/rackgroup.md @@ -0,0 +1,15 @@ +# Rack Groups + +Racks can optionally be assigned to rack groups to reflect their physical placement. Rack groups provide a secondary means of categorization alongside [locations](./location.md), which is particularly useful for datacenter operators who need to group racks by row, aisle, or similar physical arrangement while keeping them assigned to the same location, such as a cage or room. Rack groups are flat and do not form a hierarchy. + +Rack groups can also be used to scope [VLAN groups](../ipam/vlangroup.md), which can help model L2 domains spanning rows or pairs of racks. + +## Fields + +### Name + +A unique human-friendly name. + +### Slug + +A unique URL-friendly identifier. (This value can be used for filtering.) diff --git a/mkdocs.yml b/mkdocs.yml index dc758f197..f5c7b9663 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -221,6 +221,7 @@ nav: - PowerPort: 'models/dcim/powerport.md' - PowerPortTemplate: 'models/dcim/powerporttemplate.md' - Rack: 'models/dcim/rack.md' + - RackGroup: 'models/dcim/rackgroup.md' - RackReservation: 'models/dcim/rackreservation.md' - RackRole: 'models/dcim/rackrole.md' - RackType: 'models/dcim/racktype.md' diff --git a/netbox/dcim/api/serializers_/racks.py b/netbox/dcim/api/serializers_/racks.py index b87140bed..8a7294f6b 100644 --- a/netbox/dcim/api/serializers_/racks.py +++ b/netbox/dcim/api/serializers_/racks.py @@ -3,7 +3,7 @@ from rest_framework import serializers from dcim.choices import * from dcim.constants import * -from dcim.models import Rack, RackReservation, RackRole, RackType +from dcim.models import Rack, RackGroup, RackReservation, RackRole, RackType from netbox.api.fields import ChoiceField, RelatedObjectCountField from netbox.api.serializers import OrganizationalModelSerializer, PrimaryModelSerializer from netbox.choices import * @@ -16,6 +16,7 @@ from .sites import LocationSerializer, SiteSerializer __all__ = ( 'RackElevationDetailFilterSerializer', + 'RackGroupSerializer', 'RackReservationSerializer', 'RackRoleSerializer', 'RackSerializer', @@ -23,6 +24,20 @@ __all__ = ( ) +class RackGroupSerializer(OrganizationalModelSerializer): + + # Related object counts + rack_count = RelatedObjectCountField('racks') + + class Meta: + model = RackGroup + fields = [ + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'description', 'owner', 'comments', 'tags', + 'custom_fields', 'created', 'last_updated', 'rack_count', + ] + brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'rack_count') + + class RackRoleSerializer(OrganizationalModelSerializer): # Related object counts @@ -87,6 +102,11 @@ class RackSerializer(RackBaseSerializer): allow_null=True, default=None ) + group = RackGroupSerializer( + nested=True, + required=False, + allow_null=True + ) tenant = TenantSerializer( nested=True, required=False, @@ -127,11 +147,11 @@ class RackSerializer(RackBaseSerializer): class Meta: model = Rack fields = [ - 'id', 'url', 'display_url', 'display', 'name', 'facility_id', 'site', 'location', 'tenant', 'status', - 'role', 'serial', 'asset_tag', 'rack_type', 'form_factor', 'width', 'u_height', 'starting_unit', 'weight', - 'max_weight', 'weight_unit', 'desc_units', 'outer_width', 'outer_height', 'outer_depth', 'outer_unit', - 'mounting_depth', 'airflow', 'description', 'owner', 'comments', 'tags', 'custom_fields', 'created', - 'last_updated', 'device_count', 'powerfeed_count', + 'id', 'url', 'display_url', 'display', 'name', 'facility_id', 'site', 'location', 'group', 'tenant', + 'status', 'role', 'serial', 'asset_tag', 'rack_type', 'form_factor', 'width', 'u_height', 'starting_unit', + 'weight', 'max_weight', 'weight_unit', 'desc_units', 'outer_width', 'outer_height', 'outer_depth', + 'outer_unit', 'mounting_depth', 'airflow', 'description', 'owner', 'comments', 'tags', 'custom_fields', + 'created', 'last_updated', 'device_count', 'powerfeed_count', ] brief_fields = ('id', 'url', 'display', 'name', 'description', 'device_count') diff --git a/netbox/dcim/api/urls.py b/netbox/dcim/api/urls.py index e20e36c2f..328e5ac0f 100644 --- a/netbox/dcim/api/urls.py +++ b/netbox/dcim/api/urls.py @@ -12,6 +12,7 @@ router.register('sites', views.SiteViewSet) # Racks router.register('locations', views.LocationViewSet) +router.register('rack-groups', views.RackGroupViewSet) router.register('rack-types', views.RackTypeViewSet) router.register('rack-roles', views.RackRoleViewSet) router.register('racks', views.RackViewSet) diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index a3bc7386a..96af81cf1 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -154,6 +154,17 @@ class LocationViewSet(MPTTLockedMixin, NetBoxModelViewSet): filterset_class = filtersets.LocationFilterSet +# +# Rack groups +# + + +class RackGroupViewSet(NetBoxModelViewSet): + queryset = RackGroup.objects.all() + serializer_class = serializers.RackGroupSerializer + filterset_class = filtersets.RackGroupFilterSet + + # # Rack roles # diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index b92ec52b4..994d68674 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -85,6 +85,7 @@ __all__ = ( 'PowerPortFilterSet', 'PowerPortTemplateFilterSet', 'RackFilterSet', + 'RackGroupFilterSet', 'RackReservationFilterSet', 'RackRoleFilterSet', 'RackTypeFilterSet', @@ -315,6 +316,14 @@ class LocationFilterSet(TenancyFilterSet, ContactModelFilterSet, NestedGroupMode return queryset +@register_filterset +class RackGroupFilterSet(OrganizationalModelFilterSet): + + class Meta: + model = RackGroup + fields = ('id', 'name', 'slug', 'description') + + @register_filterset class RackRoleFilterSet(OrganizationalModelFilterSet): @@ -419,6 +428,18 @@ class RackFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ContactModelFilterS to_field_name='slug', label=_('Location (slug)'), ) + group_id = django_filters.ModelMultipleChoiceFilter( + queryset=RackGroup.objects.all(), + distinct=False, + label=_('Group (ID)'), + ) + group = django_filters.ModelMultipleChoiceFilter( + field_name='group__slug', + queryset=RackGroup.objects.all(), + distinct=False, + to_field_name='slug', + label=_('Group (slug)'), + ) manufacturer_id = django_filters.ModelMultipleChoiceFilter( field_name='rack_type__manufacturer', queryset=Manufacturer.objects.all(), @@ -553,6 +574,19 @@ class RackReservationFilterSet(PrimaryModelFilterSet, TenancyFilterSet): to_field_name='slug', label=_('Location (slug)'), ) + group_id = django_filters.ModelMultipleChoiceFilter( + queryset=RackGroup.objects.all(), + field_name='rack__group', + distinct=False, + label=_('Group (ID)'), + ) + group = django_filters.ModelMultipleChoiceFilter( + field_name='rack__group__slug', + queryset=RackGroup.objects.all(), + distinct=False, + to_field_name='slug', + label=_('Group (slug)'), + ) status = django_filters.MultipleChoiceFilter( choices=RackReservationStatusChoices, distinct=False, diff --git a/netbox/dcim/forms/bulk_edit.py b/netbox/dcim/forms/bulk_edit.py index ad41e5a74..fff3fcddf 100644 --- a/netbox/dcim/forms/bulk_edit.py +++ b/netbox/dcim/forms/bulk_edit.py @@ -61,6 +61,7 @@ __all__ = ( 'PowerPortBulkEditForm', 'PowerPortTemplateBulkEditForm', 'RackBulkEditForm', + 'RackGroupBulkEditForm', 'RackReservationBulkEditForm', 'RackRoleBulkEditForm', 'RackTypeBulkEditForm', @@ -201,6 +202,14 @@ class LocationBulkEditForm(NestedGroupModelBulkEditForm): nullable_fields = ('parent', 'tenant', 'facility', 'description', 'comments') +class RackGroupBulkEditForm(OrganizationalModelBulkEditForm): + model = RackGroup + fieldsets = ( + FieldSet('description'), + ) + nullable_fields = ('description', 'comments') + + class RackRoleBulkEditForm(OrganizationalModelBulkEditForm): color = ColorField( label=_('Color'), @@ -336,6 +345,11 @@ class RackBulkEditForm(PrimaryModelBulkEditForm): 'site_id': '$site' } ) + group = DynamicModelChoiceField( + label=_('Group'), + queryset=RackGroup.objects.all(), + required=False + ) tenant = DynamicModelChoiceField( label=_('Tenant'), queryset=Tenant.objects.all(), @@ -435,14 +449,16 @@ class RackBulkEditForm(PrimaryModelBulkEditForm): model = Rack fieldsets = ( - FieldSet('status', 'role', 'tenant', 'serial', 'asset_tag', 'rack_type', 'description', name=_('Rack')), + FieldSet( + 'status', 'group', 'role', 'tenant', 'serial', 'asset_tag', 'rack_type', 'description', name=_('Rack') + ), FieldSet('region', 'site_group', 'site', 'location', name=_('Location')), FieldSet('outer_width', 'outer_height', 'outer_depth', 'outer_unit', name=_('Outer Dimensions')), FieldSet('form_factor', 'width', 'u_height', 'desc_units', 'airflow', 'mounting_depth', name=_('Hardware')), FieldSet('weight', 'max_weight', 'weight_unit', name=_('Weight')), ) nullable_fields = ( - 'location', 'tenant', 'role', 'serial', 'asset_tag', 'outer_width', 'outer_height', 'outer_depth', + 'location', 'group', 'tenant', 'role', 'serial', 'asset_tag', 'outer_width', 'outer_height', 'outer_depth', 'outer_unit', 'weight', 'max_weight', 'weight_unit', 'description', 'comments', ) diff --git a/netbox/dcim/forms/bulk_import.py b/netbox/dcim/forms/bulk_import.py index c14b7d533..1749153db 100644 --- a/netbox/dcim/forms/bulk_import.py +++ b/netbox/dcim/forms/bulk_import.py @@ -57,6 +57,7 @@ __all__ = ( 'PowerOutletImportForm', 'PowerPanelImportForm', 'PowerPortImportForm', + 'RackGroupImportForm', 'RackImportForm', 'RackReservationImportForm', 'RackRoleImportForm', @@ -187,6 +188,13 @@ class LocationImportForm(NestedGroupModelImportForm): self.fields['parent'].queryset = self.fields['parent'].queryset.filter(**params) +class RackGroupImportForm(OrganizationalModelImportForm): + + class Meta: + model = RackGroup + fields = ('name', 'slug', 'description', 'owner', 'comments', 'tags') + + class RackRoleImportForm(OrganizationalModelImportForm): class Meta: @@ -261,6 +269,13 @@ class RackImportForm(PrimaryModelImportForm): to_field_name='name', help_text=_('Name of assigned tenant') ) + group = CSVModelChoiceField( + label=_('Rack group'), + queryset=RackGroup.objects.all(), + required=False, + to_field_name='name', + help_text=_('Name of assigned group') + ) status = CSVChoiceField( label=_('Status'), choices=RackStatusChoices, @@ -318,10 +333,10 @@ class RackImportForm(PrimaryModelImportForm): class Meta: model = Rack fields = ( - 'site', 'location', 'name', 'facility_id', 'tenant', 'status', 'role', 'rack_type', 'form_factor', 'serial', - 'asset_tag', 'width', 'u_height', 'desc_units', 'outer_width', 'outer_height', 'outer_depth', 'outer_unit', - 'mounting_depth', 'airflow', 'weight', 'max_weight', 'weight_unit', 'description', 'owner', 'comments', - 'tags', + 'site', 'location', 'group', 'name', 'facility_id', 'tenant', 'status', 'role', 'rack_type', 'form_factor', + 'serial', 'asset_tag', 'width', 'u_height', 'desc_units', 'outer_width', 'outer_height', 'outer_depth', + 'outer_unit', 'mounting_depth', 'airflow', 'weight', 'max_weight', 'weight_unit', 'description', 'owner', + 'comments', 'tags', ) def __init__(self, data=None, *args, **kwargs): diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py index b375f2bba..9fbdb6010 100644 --- a/netbox/dcim/forms/filtersets.py +++ b/netbox/dcim/forms/filtersets.py @@ -64,6 +64,7 @@ __all__ = ( 'PowerPortTemplateFilterForm', 'RackElevationFilterForm', 'RackFilterForm', + 'RackGroupFilterForm', 'RackReservationFilterForm', 'RackRoleFilterForm', 'RackTypeFilterForm', @@ -276,6 +277,15 @@ class LocationFilterForm(TenancyFilterForm, ContactModelFilterForm, NestedGroupM tag = TagFilterField(model) +class RackGroupFilterForm(OrganizationalModelFilterSetForm): + model = RackGroup + fieldsets = ( + FieldSet('q', 'filter_id', 'tag'), + FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), + ) + tag = TagFilterField(model) + + class RackRoleFilterForm(OrganizationalModelFilterSetForm): model = RackRole fieldsets = ( @@ -355,7 +365,7 @@ class RackFilterForm(TenancyFilterForm, ContactModelFilterForm, RackBaseFilterFo model = Rack fieldsets = ( FieldSet('q', 'filter_id', 'tag'), - FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', name=_('Location')), + FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', 'group_id', name=_('Location')), FieldSet('status', 'role_id', 'manufacturer_id', 'rack_type_id', 'serial', 'asset_tag', name=_('Rack')), FieldSet('form_factor', 'width', 'u_height', 'airflow', name=_('Hardware')), FieldSet('starting_unit', 'desc_units', name=_('Numbering')), @@ -392,6 +402,12 @@ class RackFilterForm(TenancyFilterForm, ContactModelFilterForm, RackBaseFilterFo }, label=_('Location') ) + group_id = DynamicModelMultipleChoiceField( + queryset=RackGroup.objects.all(), + required=False, + null_option='None', + label=_('Rack group') + ) status = forms.MultipleChoiceField( label=_('Status'), choices=RackStatusChoices, @@ -435,7 +451,7 @@ class RackFilterForm(TenancyFilterForm, ContactModelFilterForm, RackBaseFilterFo class RackElevationFilterForm(RackFilterForm): fieldsets = ( FieldSet('q', 'filter_id', 'tag'), - FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', 'id', name=_('Location')), + FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', 'group_id', 'id', name=_('Location')), FieldSet('status', 'role_id', name=_('Function')), FieldSet('type', 'width', 'serial', 'asset_tag', name=_('Hardware')), FieldSet('weight', 'max_weight', 'weight_unit', name=_('Weight')), @@ -459,7 +475,7 @@ class RackReservationFilterForm(TenancyFilterForm, PrimaryModelFilterSetForm): fieldsets = ( FieldSet('q', 'filter_id', 'tag'), FieldSet('status', 'user_id', name=_('Reservation')), - FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id', name=_('Rack')), + FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', 'group_id', 'rack_id', name=_('Rack')), FieldSet('tenant_group_id', 'tenant_id', name=_('Tenant')), FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), ) @@ -491,10 +507,17 @@ class RackReservationFilterForm(TenancyFilterForm, PrimaryModelFilterSetForm): label=_('Location'), null_option='None' ) + group_id = DynamicModelMultipleChoiceField( + queryset=RackGroup.objects.all(), + required=False, + null_option='None', + label=_('Rack group') + ) rack_id = DynamicModelMultipleChoiceField( queryset=Rack.objects.all(), required=False, query_params={ + 'group_id': '$group_id', 'site_id': '$site_id', 'location_id': '$location_id', }, diff --git a/netbox/dcim/forms/model_forms.py b/netbox/dcim/forms/model_forms.py index 741315323..aedc30943 100644 --- a/netbox/dcim/forms/model_forms.py +++ b/netbox/dcim/forms/model_forms.py @@ -74,6 +74,7 @@ __all__ = ( 'PowerPortForm', 'PowerPortTemplateForm', 'RackForm', + 'RackGroupForm', 'RackReservationForm', 'RackRoleForm', 'RackTypeForm', @@ -206,6 +207,18 @@ class LocationForm(TenancyForm, NestedGroupModelForm): ) +class RackGroupForm(OrganizationalModelForm): + fieldsets = ( + FieldSet('name', 'slug', 'description', 'tags', name=_('Rack Group')), + ) + + class Meta: + model = RackGroup + fields = [ + 'name', 'slug', 'description', 'owner', 'comments', 'tags', + ] + + class RackRoleForm(OrganizationalModelForm): fieldsets = ( FieldSet('name', 'slug', 'color', 'description', 'tags', name=_('Rack Role')), @@ -263,6 +276,11 @@ class RackForm(TenancyForm, PrimaryModelForm): 'site_id': '$site' } ) + group = DynamicModelChoiceField( + label=_('Rack Group'), + queryset=RackGroup.objects.all(), + required=False + ) role = DynamicModelChoiceField( label=_('Role'), queryset=RackRole.objects.all(), @@ -278,7 +296,7 @@ class RackForm(TenancyForm, PrimaryModelForm): fieldsets = ( FieldSet( - 'site', 'location', 'name', 'status', 'role', 'rack_type', 'description', 'airflow', 'tags', + 'site', 'location', 'group', 'name', 'status', 'role', 'rack_type', 'description', 'airflow', 'tags', name=_('Rack') ), FieldSet('facility_id', 'serial', 'asset_tag', name=_('Inventory Control')), @@ -288,7 +306,7 @@ class RackForm(TenancyForm, PrimaryModelForm): class Meta: model = Rack fields = [ - 'site', 'location', 'name', 'facility_id', 'tenant_group', 'tenant', 'status', 'role', 'serial', + 'site', 'location', 'group', 'name', 'facility_id', 'tenant_group', 'tenant', 'status', 'role', 'serial', 'asset_tag', 'rack_type', 'form_factor', 'width', 'u_height', 'starting_unit', 'desc_units', 'outer_width', 'outer_height', 'outer_depth', 'outer_unit', 'mounting_depth', 'airflow', 'weight', 'max_weight', 'weight_unit', 'description', 'owner', 'comments', 'tags', diff --git a/netbox/dcim/graphql/filters.py b/netbox/dcim/graphql/filters.py index 9d1d097a4..191e9a8fd 100644 --- a/netbox/dcim/graphql/filters.py +++ b/netbox/dcim/graphql/filters.py @@ -93,6 +93,7 @@ __all__ = ( 'PowerPortFilter', 'PowerPortTemplateFilter', 'RackFilter', + 'RackGroupFilter', 'RackReservationFilter', 'RackRoleFilter', 'RackTypeFilter', @@ -959,6 +960,10 @@ class RackFilter( location_id: Annotated['TreeNodeFilter', strawberry.lazy('netbox.graphql.filter_lookups')] | None = ( strawberry_django.filter_field() ) + group: Annotated['RackGroupFilter', strawberry.lazy('dcim.graphql.filters')] | None = ( + strawberry_django.filter_field() + ) + group_id: ID | None = strawberry_django.filter_field() status: BaseFilterLookup[Annotated['RackStatusEnum', strawberry.lazy('dcim.graphql.enums')]] | None = ( strawberry_django.filter_field() ) @@ -974,6 +979,11 @@ class RackFilter( ) +@strawberry_django.filter_type(models.RackGroup, lookups=True) +class RackGroupFilter(OrganizationalModelFilter): + pass + + @strawberry_django.filter_type(models.RackReservation, lookups=True) class RackReservationFilter(TenancyFilterMixin, PrimaryModelFilter): rack: Annotated['RackFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field() diff --git a/netbox/dcim/graphql/schema.py b/netbox/dcim/graphql/schema.py index fcf1e828f..1ee426a91 100644 --- a/netbox/dcim/graphql/schema.py +++ b/netbox/dcim/graphql/schema.py @@ -102,6 +102,9 @@ class DCIMQuery: power_port_template: PowerPortTemplateType = strawberry_django.field() power_port_template_list: list[PowerPortTemplateType] = strawberry_django.field() + rack_group: RackGroupType = strawberry_django.field() + rack_group_list: list[RackGroupType] = strawberry_django.field() + rack_type: RackTypeType = strawberry_django.field() rack_type_list: list[RackTypeType] = strawberry_django.field() diff --git a/netbox/dcim/graphql/types.py b/netbox/dcim/graphql/types.py index cf16bc39f..49aa18076 100644 --- a/netbox/dcim/graphql/types.py +++ b/netbox/dcim/graphql/types.py @@ -73,6 +73,7 @@ __all__ = ( 'PowerPanelType', 'PowerPortTemplateType', 'PowerPortType', + 'RackGroupType', 'RackReservationType', 'RackRoleType', 'RackType', @@ -736,6 +737,17 @@ class PowerPortTemplateType(ModularComponentTemplateType): poweroutlet_templates: list[Annotated["PowerOutletTemplateType", strawberry.lazy('dcim.graphql.types')]] +@strawberry_django.type( + models.RackGroup, + fields='__all__', + filters=RackGroupFilter, + pagination=True +) +class RackGroupType(OrganizationalObjectType): + + racks: list[Annotated["RackType", strawberry.lazy('dcim.graphql.types')]] + + @strawberry_django.type( models.RackType, fields='__all__', @@ -756,6 +768,7 @@ class RackTypeType(ImageAttachmentsMixin, PrimaryObjectType): class RackType(VLANGroupsMixin, ImageAttachmentsMixin, ContactsMixin, PrimaryObjectType): site: Annotated["SiteType", strawberry.lazy('dcim.graphql.types')] location: Annotated["LocationType", strawberry.lazy('dcim.graphql.types')] | None + group: Annotated["RackGroupType", strawberry.lazy('dcim.graphql.types')] | None tenant: Annotated["TenantType", strawberry.lazy('tenancy.graphql.types')] | None role: Annotated["RackRoleType", strawberry.lazy('dcim.graphql.types')] | None diff --git a/netbox/dcim/migrations/0227_rack_group.py b/netbox/dcim/migrations/0227_rack_group.py new file mode 100644 index 000000000..8563b6c07 --- /dev/null +++ b/netbox/dcim/migrations/0227_rack_group.py @@ -0,0 +1,57 @@ +import django.db.models.deletion +import taggit.managers +from django.db import migrations, models + +import netbox.models.deletion +import utilities.json + + +class Migration(migrations.Migration): + dependencies = [ + ('dcim', '0226_modulebay_rebuild_tree'), + ('extras', '0134_owner'), + ('users', '0015_owner'), + ] + + operations = [ + migrations.CreateModel( + name='RackGroup', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True, null=True)), + ('last_updated', models.DateTimeField(auto_now=True, null=True)), + ( + 'custom_field_data', + models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder), + ), + ('name', models.CharField(max_length=100, unique=True)), + ('slug', models.SlugField(max_length=100, unique=True)), + ('description', models.CharField(blank=True, max_length=200)), + ('comments', models.TextField(blank=True)), + ( + 'owner', + models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='users.owner' + ), + ), + ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), + ], + options={ + 'verbose_name': 'rack group', + 'verbose_name_plural': 'rack groups', + 'ordering': ('name',), + }, + bases=(netbox.models.deletion.DeleteMixin, models.Model), + ), + migrations.AddField( + model_name='rack', + name='group', + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name='racks', + to='dcim.rackgroup', + ), + ), + ] diff --git a/netbox/dcim/models/racks.py b/netbox/dcim/models/racks.py index 60707cb06..334235f32 100644 --- a/netbox/dcim/models/racks.py +++ b/netbox/dcim/models/racks.py @@ -29,14 +29,30 @@ from .power import PowerFeed __all__ = ( 'Rack', + 'RackGroup', 'RackReservation', 'RackRole', 'RackType', ) +# +# Rack Organization +# + + +class RackGroup(OrganizationalModel): + """ + Racks can be grouped by physical placement within a Location. + """ + + class Meta: + ordering = ('name',) + verbose_name = _('rack group') + verbose_name_plural = _('rack groups') + # -# Rack Types +# Rack Base # class RackBase(WeightMixin, PrimaryModel): @@ -123,6 +139,10 @@ class RackBase(WeightMixin, PrimaryModel): abstract = True +# +# Rack Types +# + class RackType(ImageAttachmentsMixin, RackBase): """ Devices are housed within Racks. Each rack has a defined height measured in rack units, and a front and rear face. @@ -290,6 +310,14 @@ class Rack(ContactsMixin, ImageAttachmentsMixin, TrackingModelMixin, RackBase): blank=True, null=True ) + group = models.ForeignKey( + to='dcim.RackGroup', + on_delete=models.PROTECT, + related_name='racks', + blank=True, + null=True, + help_text=_('physical grouping') + ) tenant = models.ForeignKey( to='tenancy.Tenant', on_delete=models.PROTECT, diff --git a/netbox/dcim/search.py b/netbox/dcim/search.py index f956786c6..fa5cb9156 100644 --- a/netbox/dcim/search.py +++ b/netbox/dcim/search.py @@ -315,6 +315,18 @@ class RackReservationIndex(SearchIndex): display_attrs = ('rack', 'tenant', 'user', 'description') +@register_search +class RackGroupIndex(SearchIndex): + model = models.RackGroup + fields = ( + ('name', 100), + ('slug', 110), + ('description', 500), + ('comments', 5000), + ) + display_attrs = ('description',) + + @register_search class RackRoleIndex(SearchIndex): model = models.RackRole diff --git a/netbox/dcim/tables/racks.py b/netbox/dcim/tables/racks.py index 2a1642ae9..07d27b902 100644 --- a/netbox/dcim/tables/racks.py +++ b/netbox/dcim/tables/racks.py @@ -2,13 +2,14 @@ import django_tables2 as tables from django.utils.translation import gettext_lazy as _ from django_tables2.utils import Accessor -from dcim.models import Rack, RackReservation, RackRole, RackType +from dcim.models import Rack, RackGroup, RackReservation, RackRole, RackType from netbox.tables import OrganizationalModelTable, PrimaryModelTable, columns from tenancy.tables import ContactsColumnMixin, TenancyColumnsMixin from .template_code import OUTER_UNIT, WEIGHT __all__ = ( + 'RackGroupTable', 'RackReservationTable', 'RackRoleTable', 'RackTable', @@ -16,6 +17,29 @@ __all__ = ( ) +class RackGroupTable(OrganizationalModelTable): + name = tables.Column( + verbose_name=_('Name'), + linkify=True, + ) + rack_count = columns.LinkedCountColumn( + viewname='dcim:rack_list', + url_params={'group_id': 'pk'}, + verbose_name=_('Racks'), + ) + tags = columns.TagColumn( + url_name='dcim:rackgroup_list', + ) + + class Meta(OrganizationalModelTable.Meta): + model = RackGroup + fields = ( + 'pk', 'id', 'name', 'rack_count', 'description', 'slug', 'comments', 'tags', 'actions', 'created', + 'last_updated', + ) + default_columns = ('pk', 'name', 'rack_count', 'description') + + class RackRoleTable(OrganizationalModelTable): name = tables.Column( verbose_name=_('Name'), @@ -111,6 +135,10 @@ class RackTable(TenancyColumnsMixin, ContactsColumnMixin, PrimaryModelTable): verbose_name=_('Site'), linkify=True ) + group = tables.Column( + verbose_name=_('Group'), + linkify=True, + ) status = columns.ChoiceFieldColumn( verbose_name=_('Status'), ) @@ -172,15 +200,15 @@ class RackTable(TenancyColumnsMixin, ContactsColumnMixin, PrimaryModelTable): class Meta(PrimaryModelTable.Meta): model = Rack fields = ( - 'pk', 'id', 'name', 'site', 'location', 'status', 'facility_id', 'tenant', 'tenant_group', 'role', + 'pk', 'id', 'name', 'site', 'location', 'group', 'status', 'facility_id', 'tenant', 'tenant_group', 'role', 'rack_type', 'serial', 'asset_tag', 'form_factor', 'u_height', 'starting_unit', 'width', 'outer_width', 'outer_height', 'outer_depth', 'mounting_depth', 'airflow', 'weight', 'max_weight', 'comments', 'device_count', 'get_utilization', 'get_power_utilization', 'description', 'contacts', 'tags', 'created', 'last_updated', ) default_columns = ( - 'pk', 'name', 'site', 'location', 'status', 'facility_id', 'tenant', 'role', 'rack_type', 'u_height', - 'device_count', 'get_utilization', + 'pk', 'name', 'site', 'location', 'group', 'status', 'facility_id', 'tenant', 'role', 'rack_type', + 'u_height', 'device_count', 'get_utilization', ) @@ -200,6 +228,11 @@ class RackReservationTable(TenancyColumnsMixin, PrimaryModelTable): accessor=Accessor('rack__location'), linkify=True ) + group = tables.Column( + verbose_name=_('Group'), + accessor=Accessor('rack__group'), + linkify=True + ) rack = tables.Column( verbose_name=_('Rack'), linkify=True @@ -218,7 +251,7 @@ class RackReservationTable(TenancyColumnsMixin, PrimaryModelTable): class Meta(PrimaryModelTable.Meta): model = RackReservation fields = ( - 'pk', 'id', 'reservation', 'site', 'location', 'rack', 'unit_list', 'status', 'user', 'created', 'tenant', - 'tenant_group', 'description', 'comments', 'tags', 'actions', 'created', 'last_updated', + 'pk', 'id', 'reservation', 'site', 'location', 'group', 'rack', 'unit_list', 'status', 'user', 'created', + 'tenant', 'tenant_group', 'description', 'comments', 'tags', 'actions', 'created', 'last_updated', ) default_columns = ('pk', 'reservation', 'site', 'rack', 'unit_list', 'status', 'user', 'description') diff --git a/netbox/dcim/tests/test_api.py b/netbox/dcim/tests/test_api.py index f574507f1..e0289a595 100644 --- a/netbox/dcim/tests/test_api.py +++ b/netbox/dcim/tests/test_api.py @@ -280,6 +280,38 @@ class LocationTest(APIViewTestCases.APIViewTestCase): ] +class RackGroupTest(APIViewTestCases.APIViewTestCase): + model = RackGroup + brief_fields = ['description', 'display', 'id', 'name', 'rack_count', 'slug', 'url'] + create_data = [ + { + 'name': 'Rack Group 4', + 'slug': 'rack-group-4', + }, + { + 'name': 'Rack Group 5', + 'slug': 'rack-group-5', + }, + { + 'name': 'Rack Group 6', + 'slug': 'rack-group-6', + }, + ] + bulk_update_data = { + 'description': 'New description', + } + + @classmethod + def setUpTestData(cls): + + rack_groups = ( + RackGroup(name='Rack Group 1', slug='rack-group-1'), + RackGroup(name='Rack Group 2', slug='rack-group-2'), + RackGroup(name='Rack Group 3', slug='rack-group-3'), + ) + RackGroup.objects.bulk_create(rack_groups) + + class RackRoleTest(APIViewTestCases.APIViewTestCase): model = RackRole brief_fields = ['description', 'display', 'id', 'name', 'rack_count', 'slug', 'url'] @@ -397,6 +429,12 @@ class RackTest(APIViewTestCases.APIViewTestCase): Location.objects.create(site=sites[1], name='Location 2', slug='location-2'), ) + rack_groups = ( + RackGroup(name='Rack Group 1', slug='rack-group-1'), + RackGroup(name='Rack Group 2', slug='rack-group-2'), + ) + RackGroup.objects.bulk_create(rack_groups) + rack_roles = ( RackRole(name='Rack Role 1', slug='rack-role-1', color='ff0000'), RackRole(name='Rack Role 2', slug='rack-role-2', color='00ff00'), @@ -404,9 +442,9 @@ class RackTest(APIViewTestCases.APIViewTestCase): RackRole.objects.bulk_create(rack_roles) racks = ( - Rack(site=sites[0], location=locations[0], role=rack_roles[0], name='Rack 1'), - Rack(site=sites[0], location=locations[0], role=rack_roles[0], name='Rack 2'), - Rack(site=sites[0], location=locations[0], role=rack_roles[0], name='Rack 3'), + Rack(site=sites[0], location=locations[0], group=rack_groups[0], role=rack_roles[0], name='Rack 1'), + Rack(site=sites[0], location=locations[0], group=rack_groups[0], role=rack_roles[0], name='Rack 2'), + Rack(site=sites[0], location=locations[0], group=rack_groups[0], role=rack_roles[0], name='Rack 3'), ) Rack.objects.bulk_create(racks) @@ -415,18 +453,21 @@ class RackTest(APIViewTestCases.APIViewTestCase): 'name': 'Test Rack 4', 'site': sites[1].pk, 'location': locations[1].pk, + 'group': rack_groups[1].pk, 'role': rack_roles[1].pk, }, { 'name': 'Test Rack 5', 'site': sites[1].pk, 'location': locations[1].pk, + 'group': rack_groups[1].pk, 'role': rack_roles[1].pk, }, { 'name': 'Test Rack 6', 'site': sites[1].pk, 'location': locations[1].pk, + 'group': rack_groups[1].pk, 'role': rack_roles[1].pk, }, ] diff --git a/netbox/dcim/tests/test_filtersets.py b/netbox/dcim/tests/test_filtersets.py index 23ca1ba62..d4a53bca2 100644 --- a/netbox/dcim/tests/test_filtersets.py +++ b/netbox/dcim/tests/test_filtersets.py @@ -534,6 +534,37 @@ class LocationTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) +class RackGroupTestCase(TestCase, ChangeLoggedFilterSetTests): + queryset = RackGroup.objects.all() + filterset = RackGroupFilterSet + + @classmethod + def setUpTestData(cls): + + rack_groups = ( + RackGroup(name='Rack Group 1', slug='rack-group-1', description='foobar1'), + RackGroup(name='Rack Group 2', slug='rack-group-2', description='foobar2'), + RackGroup(name='Rack Group 3', slug='rack-group-3'), + ) + RackGroup.objects.bulk_create(rack_groups) + + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + + def test_name(self): + params = {'name': ['Rack Group 1', 'Rack Group 2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_slug(self): + params = {'slug': ['rack-group-1', 'rack-group-2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + class RackRoleTestCase(TestCase, ChangeLoggedFilterSetTests): queryset = RackRole.objects.all() filterset = RackRoleFilterSet @@ -738,18 +769,18 @@ class RackTestCase(TestCase, ChangeLoggedFilterSetTests): for region in regions: region.save() - groups = ( + site_groups = ( SiteGroup(name='Site Group 1', slug='site-group-1'), SiteGroup(name='Site Group 2', slug='site-group-2'), SiteGroup(name='Site Group 3', slug='site-group-3'), ) - for group in groups: - group.save() + for site_group in site_groups: + site_group.save() sites = ( - Site(name='Site 1', slug='site-1', region=regions[0], group=groups[0]), - Site(name='Site 2', slug='site-2', region=regions[1], group=groups[1]), - Site(name='Site 3', slug='site-3', region=regions[2], group=groups[2]), + Site(name='Site 1', slug='site-1', region=regions[0], group=site_groups[0]), + Site(name='Site 2', slug='site-2', region=regions[1], group=site_groups[1]), + Site(name='Site 3', slug='site-3', region=regions[2], group=site_groups[2]), ) Site.objects.bulk_create(sites) @@ -810,6 +841,13 @@ class RackTestCase(TestCase, ChangeLoggedFilterSetTests): ) RackType.objects.bulk_create(rack_types) + rack_groups = ( + RackGroup(name='Rack Group 1', slug='rack-group-1'), + RackGroup(name='Rack Group 2', slug='rack-group-2'), + RackGroup(name='Rack Group 3', slug='rack-group-3'), + ) + RackGroup.objects.bulk_create(rack_groups) + rack_roles = ( RackRole(name='Rack Role 1', slug='rack-role-1'), RackRole(name='Rack Role 2', slug='rack-role-2'), @@ -838,6 +876,7 @@ class RackTestCase(TestCase, ChangeLoggedFilterSetTests): facility_id='rack-1', site=sites[0], location=locations[0], + group=rack_groups[0], tenant=tenants[0], status=RackStatusChoices.STATUS_ACTIVE, role=rack_roles[0], @@ -862,6 +901,7 @@ class RackTestCase(TestCase, ChangeLoggedFilterSetTests): facility_id='rack-2', site=sites[1], location=locations[1], + group=rack_groups[1], tenant=tenants[1], status=RackStatusChoices.STATUS_PLANNED, role=rack_roles[1], @@ -886,6 +926,7 @@ class RackTestCase(TestCase, ChangeLoggedFilterSetTests): facility_id='rack-3', site=sites[2], location=locations[2], + group=rack_groups[2], tenant=tenants[2], status=RackStatusChoices.STATUS_RESERVED, role=rack_roles[2], @@ -1017,6 +1058,13 @@ class RackTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'location': [locations[0].slug, locations[1].slug]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_rack_group(self): + rack_groups = RackGroup.objects.all()[:2] + params = {'group_id': [rack_groups[0].pk, rack_groups[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'group': [rack_groups[0].slug, rack_groups[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_status(self): params = {'status': [RackStatusChoices.STATUS_ACTIVE, RackStatusChoices.STATUS_PLANNED]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) @@ -1095,18 +1143,18 @@ class RackReservationTestCase(TestCase, ChangeLoggedFilterSetTests): for region in regions: region.save() - groups = ( + site_groups = ( SiteGroup(name='Site Group 1', slug='site-group-1'), SiteGroup(name='Site Group 2', slug='site-group-2'), SiteGroup(name='Site Group 3', slug='site-group-3'), ) - for group in groups: - group.save() + for site_group in site_groups: + site_group.save() sites = ( - Site(name='Site 1', slug='site-1', region=regions[0], group=groups[0]), - Site(name='Site 2', slug='site-2', region=regions[1], group=groups[1]), - Site(name='Site 3', slug='site-3', region=regions[2], group=groups[2]), + Site(name='Site 1', slug='site-1', region=regions[0], group=site_groups[0]), + Site(name='Site 2', slug='site-2', region=regions[1], group=site_groups[1]), + Site(name='Site 3', slug='site-3', region=regions[2], group=site_groups[2]), ) Site.objects.bulk_create(sites) @@ -1118,10 +1166,17 @@ class RackReservationTestCase(TestCase, ChangeLoggedFilterSetTests): for location in locations: location.save() + rack_groups = ( + RackGroup(name='Rack Group 1', slug='rack-group-1'), + RackGroup(name='Rack Group 2', slug='rack-group-2'), + RackGroup(name='Rack Group 3', slug='rack-group-3'), + ) + RackGroup.objects.bulk_create(rack_groups) + racks = ( - Rack(name='Rack 1', site=sites[0], location=locations[0]), - Rack(name='Rack 2', site=sites[1], location=locations[1]), - Rack(name='Rack 3', site=sites[2], location=locations[2]), + Rack(name='Rack 1', site=sites[0], location=locations[0], group=rack_groups[0]), + Rack(name='Rack 2', site=sites[1], location=locations[1], group=rack_groups[1]), + Rack(name='Rack 3', site=sites[2], location=locations[2], group=rack_groups[2]), ) Rack.objects.bulk_create(racks) @@ -1207,6 +1262,13 @@ class RackReservationTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'location': [locations[0].slug, locations[1].slug]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_rack_group(self): + rack_groups = RackGroup.objects.all()[:2] + params = {'group_id': [rack_groups[0].pk, rack_groups[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'group': [rack_groups[0].slug, rack_groups[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_status(self): params = {'status': [RackReservationStatusChoices.STATUS_ACTIVE, RackReservationStatusChoices.STATUS_PENDING]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) diff --git a/netbox/dcim/tests/test_views.py b/netbox/dcim/tests/test_views.py index 1aac72875..c90e6a91b 100644 --- a/netbox/dcim/tests/test_views.py +++ b/netbox/dcim/tests/test_views.py @@ -267,6 +267,47 @@ class LocationTestCase(ViewTestCases.OrganizationalObjectViewTestCase): } +class RackGroupTestCase(ViewTestCases.OrganizationalObjectViewTestCase): + model = RackGroup + + @classmethod + def setUpTestData(cls): + + rack_groups = ( + RackGroup(name='Rack Group 1', slug='rack-group-1'), + RackGroup(name='Rack Group 2', slug='rack-group-2'), + RackGroup(name='Rack Group 3', slug='rack-group-3'), + ) + RackGroup.objects.bulk_create(rack_groups) + + tags = create_tags('Alpha', 'Bravo', 'Charlie') + + cls.form_data = { + 'name': 'Rack Group X', + 'slug': 'rack-group-x', + 'description': 'New group', + 'tags': [t.pk for t in tags], + } + + cls.csv_data = ( + "name,slug,description", + "Rack Group 4,rack-group-4,Fourth group", + "Rack Group 5,rack-group-5,Fifth group", + "Rack Group 6,rack-group-6,", + ) + + cls.csv_update_data = ( + "id,name,description", + f"{rack_groups[0].pk},Rack Group 7,New description7", + f"{rack_groups[1].pk},Rack Group 8,New description8", + f"{rack_groups[2].pk},Rack Group 9,New description9", + ) + + cls.bulk_edit_data = { + 'description': 'New description', + } + + class RackRoleTestCase(ViewTestCases.OrganizationalObjectViewTestCase): model = RackRole @@ -472,6 +513,12 @@ class RackTestCase(ViewTestCases.PrimaryObjectViewTestCase): for location in locations: location.save() + rack_groups = ( + RackGroup(name='Rack Group 1', slug='rack-group-1'), + RackGroup(name='Rack Group 2', slug='rack-group-2'), + ) + RackGroup.objects.bulk_create(rack_groups) + rackroles = ( RackRole(name='Rack Role 1', slug='rack-role-1'), RackRole(name='Rack Role 2', slug='rack-role-2'), @@ -479,8 +526,8 @@ class RackTestCase(ViewTestCases.PrimaryObjectViewTestCase): RackRole.objects.bulk_create(rackroles) racks = ( - Rack(name='Rack 1', site=sites[0]), - Rack(name='Rack 2', site=sites[0]), + Rack(name='Rack 1', site=sites[0], group=rack_groups[0], role=rackroles[0]), + Rack(name='Rack 2', site=sites[0], group=rack_groups[1]), Rack(name='Rack 3', site=sites[0]), ) Rack.objects.bulk_create(racks) @@ -492,6 +539,7 @@ class RackTestCase(ViewTestCases.PrimaryObjectViewTestCase): 'facility_id': 'Facility X', 'site': sites[1].pk, 'location': locations[1].pk, + 'group': rack_groups[1].pk, 'tenant': None, 'status': RackStatusChoices.STATUS_PLANNED, 'role': rackroles[1].pk, @@ -513,10 +561,10 @@ class RackTestCase(ViewTestCases.PrimaryObjectViewTestCase): } cls.csv_data = ( - "site,location,name,status,width,u_height,weight,max_weight,weight_unit", - "Site 1,,Rack 4,active,19,42,100,2000,kg", - "Site 1,Location 1,Rack 5,active,19,42,100,2000,kg", - "Site 2,Location 2,Rack 6,active,19,42,100,2000,kg", + "site,location,group,name,status,width,u_height,weight,max_weight,weight_unit", + "Site 1,,,Rack 4,active,19,42,100,2000,kg", + "Site 1,Location 1,Rack Group 1,Rack 5,active,19,42,100,2000,kg", + "Site 2,Location 2,Rack Group 2,Rack 6,active,19,42,100,2000,kg", ) cls.csv_update_data = ( @@ -529,6 +577,7 @@ class RackTestCase(ViewTestCases.PrimaryObjectViewTestCase): cls.bulk_edit_data = { 'site': sites[1].pk, 'location': locations[1].pk, + 'group': rack_groups[1].pk, 'tenant': None, 'status': RackStatusChoices.STATUS_DEPRECATED, 'role': rackroles[1].pk, diff --git a/netbox/dcim/ui/panels.py b/netbox/dcim/ui/panels.py index fa7ad848a..a7b56217a 100644 --- a/netbox/dcim/ui/panels.py +++ b/netbox/dcim/ui/panels.py @@ -43,6 +43,7 @@ class RackPanel(panels.ObjectAttributesPanel): region = attrs.NestedObjectAttr('site.region', linkify=True) site = attrs.RelatedObjectAttr('site', linkify=True, grouped_by='group') location = attrs.NestedObjectAttr('location', linkify=True) + group = attrs.RelatedObjectAttr('group', linkify=True, label=_('Rack group')) name = attrs.TextAttr('name') facility_id = attrs.TextAttr('facility_id', label=_('Facility ID')) tenant = attrs.RelatedObjectAttr('tenant', linkify=True, grouped_by='group') diff --git a/netbox/dcim/urls.py b/netbox/dcim/urls.py index b24c81069..f3e1d6675 100644 --- a/netbox/dcim/urls.py +++ b/netbox/dcim/urls.py @@ -19,6 +19,9 @@ urlpatterns = [ path('locations/', include(get_model_urls('dcim', 'location', detail=False))), path('locations//', include(get_model_urls('dcim', 'location'))), + path('rack-groups/', include(get_model_urls('dcim', 'rackgroup', detail=False))), + path('rack-groups//', include(get_model_urls('dcim', 'rackgroup'))), + path('rack-roles/', include(get_model_urls('dcim', 'rackrole', detail=False))), path('rack-roles//', include(get_model_urls('dcim', 'rackrole'))), diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index a2b0b6f31..ebcf60ec8 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -785,6 +785,85 @@ class LocationBulkDeleteView(generic.BulkDeleteView): table = tables.LocationTable +# +# Rack groups +# + + +@register_model_view(RackGroup, 'list', path='', detail=False) +class RackGroupListView(generic.ObjectListView): + queryset = RackGroup.objects.annotate( + rack_count=count_related(Rack, 'group') + ) + filterset = filtersets.RackGroupFilterSet + filterset_form = forms.RackGroupFilterForm + table = tables.RackGroupTable + + +@register_model_view(RackGroup) +class RackGroupView(GetRelatedModelsMixin, generic.ObjectView): + queryset = RackGroup.objects.all() + layout = layout.SimpleLayout( + left_panels=[ + OrganizationalObjectPanel(), + TagsPanel(), + ], + right_panels=[ + RelatedObjectsPanel(), + CustomFieldsPanel(), + CommentsPanel(), + ], + ) + + def get_extra_context(self, request, instance): + return { + 'related_models': self.get_related_models(request, instance), + } + + +@register_model_view(RackGroup, 'add', detail=False) +@register_model_view(RackGroup, 'edit') +class RackGroupEditView(generic.ObjectEditView): + queryset = RackGroup.objects.all() + form = forms.RackGroupForm + + +@register_model_view(RackGroup, 'delete') +class RackGroupDeleteView(generic.ObjectDeleteView): + queryset = RackGroup.objects.all() + + +@register_model_view(RackGroup, 'bulk_import', path='import', detail=False) +class RackGroupBulkImportView(generic.BulkImportView): + queryset = RackGroup.objects.all() + model_form = forms.RackGroupImportForm + + +@register_model_view(RackGroup, 'bulk_edit', path='edit', detail=False) +class RackGroupBulkEditView(generic.BulkEditView): + queryset = RackGroup.objects.annotate( + rack_count=count_related(Rack, 'group') + ) + filterset = filtersets.RackGroupFilterSet + table = tables.RackGroupTable + form = forms.RackGroupBulkEditForm + + +@register_model_view(RackGroup, 'bulk_rename', path='rename', detail=False) +class RackGroupBulkRenameView(generic.BulkRenameView): + queryset = RackGroup.objects.all() + filterset = filtersets.RackGroupFilterSet + + +@register_model_view(RackGroup, 'bulk_delete', path='delete', detail=False) +class RackGroupBulkDeleteView(generic.BulkDeleteView): + queryset = RackGroup.objects.annotate( + rack_count=count_related(Rack, 'group') + ) + filterset = filtersets.RackGroupFilterSet + table = tables.RackGroupTable + + # # Rack roles # @@ -1160,7 +1239,7 @@ class RackReservationView(generic.ObjectView): queryset = RackReservation.objects.all() layout = layout.SimpleLayout( left_panels=[ - panels.RackPanel(accessor='object.rack', only=['region', 'site', 'location', 'name']), + panels.RackPanel(accessor='object.rack', only=['region', 'site', 'location', 'group', 'name']), panels.RackReservationPanel(title=_('Reservation')), CustomFieldsPanel(), TagsPanel(), diff --git a/netbox/extras/tests/test_filtersets.py b/netbox/extras/tests/test_filtersets.py index 4eb8533eb..0e6237f5f 100644 --- a/netbox/extras/tests/test_filtersets.py +++ b/netbox/extras/tests/test_filtersets.py @@ -1279,6 +1279,7 @@ class TagTestCase(TestCase, ChangeLoggedFilterSetTests): 'provideraccount', 'providernetwork', 'rack', + 'rackgroup', 'rackreservation', 'rackrole', 'racktype', diff --git a/netbox/ipam/constants.py b/netbox/ipam/constants.py index 44c5e7d39..223b785b3 100644 --- a/netbox/ipam/constants.py +++ b/netbox/ipam/constants.py @@ -74,7 +74,7 @@ VLAN_VID_MAX = 4094 # models values for ContentTypes which may be VLANGroup scope types VLANGROUP_SCOPE_TYPES = ( - 'region', 'sitegroup', 'site', 'location', 'rack', 'clustergroup', 'cluster', + 'region', 'sitegroup', 'site', 'location', 'rackgroup', 'rack', 'clustergroup', 'cluster', ) diff --git a/netbox/ipam/filtersets.py b/netbox/ipam/filtersets.py index 4e8ec5d88..d4dd39433 100644 --- a/netbox/ipam/filtersets.py +++ b/netbox/ipam/filtersets.py @@ -958,6 +958,9 @@ class VLANGroupFilterSet(OrganizationalModelFilterSet, TenancyFilterSet): location = django_filters.NumberFilter( method='filter_scope' ) + rack_group = django_filters.NumberFilter( + method='filter_scope' + ) rack = django_filters.NumberFilter( method='filter_scope' ) diff --git a/netbox/ipam/forms/filtersets.py b/netbox/ipam/forms/filtersets.py index dbb9765a7..a141cb491 100644 --- a/netbox/ipam/forms/filtersets.py +++ b/netbox/ipam/forms/filtersets.py @@ -1,7 +1,7 @@ from django import forms from django.utils.translation import gettext_lazy as _ -from dcim.models import Device, Location, Rack, Region, Site, SiteGroup +from dcim.models import Device, Location, Rack, RackGroup, Region, Site, SiteGroup from ipam.choices import * from ipam.constants import * from ipam.models import * @@ -458,7 +458,7 @@ class FHRPGroupFilterForm(PrimaryModelFilterSetForm): class VLANGroupFilterForm(TenancyFilterForm, OrganizationalModelFilterSetForm): fieldsets = ( FieldSet('q', 'filter_id', 'tag'), - FieldSet('region', 'site_group', 'site', 'location', 'rack', name=_('Location')), + FieldSet('region', 'site_group', 'site', 'location', 'rack_group', 'rack', name=_('Location')), FieldSet('cluster_group', 'cluster', name=_('Cluster')), FieldSet('contains_vid', name=_('VLANs')), FieldSet('tenant_group_id', 'tenant_id', name=_('Tenant')), @@ -485,6 +485,11 @@ class VLANGroupFilterForm(TenancyFilterForm, OrganizationalModelFilterSetForm): required=False, label=_('Location') ) + rack_group = DynamicModelMultipleChoiceField( + queryset=RackGroup.objects.all(), + required=False, + label=_('Rack group') + ) rack = DynamicModelMultipleChoiceField( queryset=Rack.objects.all(), required=False, diff --git a/netbox/netbox/navigation/menu.py b/netbox/netbox/navigation/menu.py index 1de2df0aa..0e0fa31d0 100644 --- a/netbox/netbox/navigation/menu.py +++ b/netbox/netbox/navigation/menu.py @@ -50,7 +50,6 @@ RACKS_MENU = Menu( label=_('Racks'), items=( get_model_item('dcim', 'rack', _('Racks')), - get_model_item('dcim', 'rackrole', _('Rack Roles')), get_model_item('dcim', 'rackreservation', _('Reservations')), MenuItem( link='dcim:rack_elevation_list', @@ -59,6 +58,13 @@ RACKS_MENU = Menu( ), ), ), + MenuGroup( + label=_('Rack Organization'), + items=( + get_model_item('dcim', 'rackgroup', _('Rack Groups')), + get_model_item('dcim', 'rackrole', _('Rack Roles')), + ), + ), MenuGroup( label=_('Rack Types'), items=( diff --git a/netbox/templates/dcim/rackgroup.html b/netbox/templates/dcim/rackgroup.html new file mode 100644 index 000000000..7381de86f --- /dev/null +++ b/netbox/templates/dcim/rackgroup.html @@ -0,0 +1,10 @@ +{% extends 'generic/object.html' %} +{% load i18n %} + +{% block extra_controls %} + {% if perms.dcim.add_rack %} + + {% trans "Add Rack" %} + + {% endif %} +{% endblock extra_controls %} From 80cc7e0d91390a7c693c501b097b4ddf16694db5 Mon Sep 17 00:00:00 2001 From: Jason Novinger Date: Tue, 10 Mar 2026 16:03:28 -0500 Subject: [PATCH 017/104] Closes #21157: Add public models to export template context Move shared get_context() logic from ConfigTemplate into RenderTemplateMixin so ExportTemplate also gets access to all public model classes. This enables export templates to perform cross-model lookups (e.g. resolving parent Prefix from IPAddress). --- netbox/extras/models/configs.py | 17 ------------ netbox/extras/models/mixins.py | 16 ++++++++--- netbox/extras/models/models.py | 10 ++----- netbox/extras/tests/test_models.py | 43 +++++++++++++++++++++++++++++- 4 files changed, 57 insertions(+), 29 deletions(-) diff --git a/netbox/extras/models/configs.py b/netbox/extras/models/configs.py index 88ec1276e..1aaeec1ab 100644 --- a/netbox/extras/models/configs.py +++ b/netbox/extras/models/configs.py @@ -1,5 +1,3 @@ -from collections import defaultdict - import jsonschema from django.conf import settings from django.core.validators import ValidationError @@ -8,7 +6,6 @@ from django.urls import reverse from django.utils.translation import gettext_lazy as _ from jsonschema.exceptions import ValidationError as JSONValidationError -from core.models import ObjectType from extras.models.mixins import RenderTemplateMixin from extras.querysets import ConfigContextQuerySet from netbox.models import ChangeLoggedModel, PrimaryModel @@ -302,17 +299,3 @@ class ConfigTemplate( """ self.template_code = self.data_file.data_as_string sync_data.alters_data = True - - def get_context(self, context=None, queryset=None): - _context = defaultdict(dict) - - # Populate all public models for reference within the template - for object_type in ObjectType.objects.public(): - if model := object_type.model_class(): - _context[object_type.app_label][model.__name__] = model - - # Apply the provided context data, if any - if context is not None: - _context.update(context) - - return _context diff --git a/netbox/extras/models/mixins.py b/netbox/extras/models/mixins.py index 47a0b97e8..704f96133 100644 --- a/netbox/extras/models/mixins.py +++ b/netbox/extras/models/mixins.py @@ -2,6 +2,7 @@ import importlib.abc import importlib.util import os import sys +from collections import defaultdict from django.core.files.storage import storages from django.db import models @@ -9,6 +10,7 @@ from django.http import HttpResponse from django.utils.module_loading import import_string from django.utils.translation import gettext_lazy as _ +from core.models import ObjectType from extras.constants import DEFAULT_MIME_TYPE, JINJA_ENV_PARAMS_WITH_PATH_IMPORT from extras.utils import filename_from_model, filename_from_object from utilities.jinja2 import render_jinja2 @@ -120,9 +122,17 @@ class RenderTemplateMixin(models.Model): abstract = True def get_context(self, context=None, queryset=None): - raise NotImplementedError(_("{class_name} must implement a get_context() method.").format( - class_name=self.__class__ - )) + _context = defaultdict(dict) + + # Populate all public models for reference within the template + for object_type in ObjectType.objects.public(): + if model := object_type.model_class(): + _context[object_type.app_label][model.__name__] = model + + if context is not None: + _context.update(context) + + return _context def get_environment_params(self): """ diff --git a/netbox/extras/models/models.py b/netbox/extras/models/models.py index 8aca58a08..9a24a65d7 100644 --- a/netbox/extras/models/models.py +++ b/netbox/extras/models/models.py @@ -458,14 +458,8 @@ class ExportTemplate( sync_data.alters_data = True def get_context(self, context=None, queryset=None): - _context = { - 'queryset': queryset, - } - - # Apply the provided context data, if any - if context is not None: - _context.update(context) - + _context = super().get_context(context=context, queryset=queryset) + _context['queryset'] = queryset return _context diff --git a/netbox/extras/tests/test_models.py b/netbox/extras/tests/test_models.py index af673645e..46cf4fe7d 100644 --- a/netbox/extras/tests/test_models.py +++ b/netbox/extras/tests/test_models.py @@ -8,7 +8,15 @@ from django.test import TestCase, tag from core.models import AutoSyncRecord, DataSource, ObjectType from dcim.models import Device, DeviceRole, DeviceType, Location, Manufacturer, Platform, Region, Site, SiteGroup -from extras.models import ConfigContext, ConfigContextProfile, ConfigTemplate, ImageAttachment, Tag, TaggedItem +from extras.models import ( + ConfigContext, + ConfigContextProfile, + ConfigTemplate, + ExportTemplate, + ImageAttachment, + Tag, + TaggedItem, +) from tenancy.models import Tenant, TenantGroup from utilities.exceptions import AbortRequest from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine @@ -808,3 +816,36 @@ class ConfigTemplateTest(TestCase): object_id=config_template.pk ) self.assertEqual(autosync_records.count(), 0, "AutoSyncRecord should be deleted after detaching") + + +class ExportTemplateContextTest(TestCase): + """ + Tests for ExportTemplate.get_context() including public model population. + """ + + def test_get_context_includes_public_models(self): + et = ExportTemplate(name='test', template_code='test') + ctx = et.get_context() + + self.assertIs(ctx['dcim']['Site'], Site) + self.assertIs(ctx['dcim']['Device'], Device) + + def test_get_context_includes_queryset(self): + et = ExportTemplate(name='test', template_code='test') + qs = Site.objects.all() + ctx = et.get_context(queryset=qs) + + self.assertIs(ctx['queryset'], qs) + + def test_get_context_applies_extra_context(self): + et = ExportTemplate(name='test', template_code='test') + ctx = et.get_context(context={'custom_key': 'custom_value'}) + + self.assertEqual(ctx['custom_key'], 'custom_value') + self.assertIs(ctx['dcim']['Site'], Site) + + def test_config_template_get_context_includes_public_models(self): + ct = ConfigTemplate(name='test', template_code='test') + ctx = ct.get_context() + + self.assertIs(ctx['dcim']['Site'], Site) From 02165a28a08c975ac6d79a06b93c2ce0d3ae9eb7 Mon Sep 17 00:00:00 2001 From: bctiemann Date: Wed, 11 Mar 2026 12:43:40 -0400 Subject: [PATCH 018/104] Closes #20151: Add support for cable bundles (#21636) --- docs/development/models.md | 1 + docs/models/dcim/cablebundle.md | 15 +++++ mkdocs.yml | 1 + netbox/dcim/api/serializers_/cables.py | 18 +++++- netbox/dcim/api/urls.py | 1 + netbox/dcim/api/views.py | 9 +++ netbox/dcim/filtersets.py | 28 +++++++++ netbox/dcim/forms/bulk_edit.py | 28 ++++++++- netbox/dcim/forms/bulk_import.py | 16 ++++- netbox/dcim/forms/filtersets.py | 20 ++++++- netbox/dcim/forms/model_forms.py | 19 +++++- netbox/dcim/graphql/filters.py | 6 ++ netbox/dcim/graphql/schema.py | 3 + netbox/dcim/graphql/types.py | 12 ++++ netbox/dcim/migrations/0228_cable_bundle.py | 54 +++++++++++++++++ netbox/dcim/models/cables.py | 38 +++++++++++- netbox/dcim/search.py | 11 ++++ netbox/dcim/tables/cables.py | 31 +++++++++- netbox/dcim/tests/test_api.py | 54 +++++++++++++++++ netbox/dcim/tests/test_filtersets.py | 26 ++++++++ netbox/dcim/tests/test_views.py | 39 ++++++++++++ netbox/dcim/urls.py | 3 + netbox/dcim/views.py | 66 +++++++++++++++++++++ netbox/extras/tests/test_filtersets.py | 1 + netbox/netbox/navigation/menu.py | 1 + netbox/templates/dcim/cable.html | 4 ++ netbox/templates/dcim/cablebundle.html | 41 +++++++++++++ netbox/templates/dcim/htmx/cable_edit.html | 1 + 28 files changed, 537 insertions(+), 10 deletions(-) create mode 100644 docs/models/dcim/cablebundle.md create mode 100644 netbox/dcim/migrations/0228_cable_bundle.py create mode 100644 netbox/templates/dcim/cablebundle.html diff --git a/docs/development/models.md b/docs/development/models.md index 7c11d5521..b6ff436a0 100644 --- a/docs/development/models.md +++ b/docs/development/models.md @@ -45,6 +45,7 @@ These are considered the "core" application models which are used to model netwo * [core.DataSource](../models/core/datasource.md) * [core.Job](../models/core/job.md) * [dcim.Cable](../models/dcim/cable.md) +* [dcim.CableBundle](../models/dcim/cablebundle.md) * [dcim.Device](../models/dcim/device.md) * [dcim.DeviceType](../models/dcim/devicetype.md) * [dcim.Module](../models/dcim/module.md) diff --git a/docs/models/dcim/cablebundle.md b/docs/models/dcim/cablebundle.md new file mode 100644 index 000000000..cf585b378 --- /dev/null +++ b/docs/models/dcim/cablebundle.md @@ -0,0 +1,15 @@ +# Cable Bundles + +A cable bundle is a logical grouping of individual [cables](./cable.md). Bundles can be used to organize cables that share a common purpose, route, or physical grouping (such as a conduit or harness). + +Assigning cables to a bundle is optional and does not affect cable tracing or connectivity. Bundles persist independently of their member cables: deleting a cable clears its bundle assignment but does not delete the bundle itself. + +## Fields + +### Name + +A unique name for the cable bundle. + +### Description + +A brief description of the bundle's purpose or contents. diff --git a/mkdocs.yml b/mkdocs.yml index f5c7b9663..7b7f5a2f1 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -189,6 +189,7 @@ nav: - Job: 'models/core/job.md' - DCIM: - Cable: 'models/dcim/cable.md' + - CableBundle: 'models/dcim/cablebundle.md' - ConsolePort: 'models/dcim/consoleport.md' - ConsolePortTemplate: 'models/dcim/consoleporttemplate.md' - ConsoleServerPort: 'models/dcim/consoleserverport.md' diff --git a/netbox/dcim/api/serializers_/cables.py b/netbox/dcim/api/serializers_/cables.py index 2b49acbc5..e0c2204d6 100644 --- a/netbox/dcim/api/serializers_/cables.py +++ b/netbox/dcim/api/serializers_/cables.py @@ -3,7 +3,7 @@ from drf_spectacular.utils import extend_schema_field from rest_framework import serializers from dcim.choices import * -from dcim.models import Cable, CablePath, CableTermination +from dcim.models import Cable, CableBundle, CablePath, CableTermination from netbox.api.fields import ChoiceField, ContentTypeField from netbox.api.gfk_fields import GFKSerializerField from netbox.api.serializers import ( @@ -16,6 +16,7 @@ from tenancy.api.serializers_.tenants import TenantSerializer from utilities.api import get_serializer_for_model __all__ = ( + 'CableBundleSerializer', 'CablePathSerializer', 'CableSerializer', 'CableTerminationSerializer', @@ -24,6 +25,18 @@ __all__ = ( ) +class CableBundleSerializer(PrimaryModelSerializer): + cable_count = serializers.IntegerField(read_only=True, default=0) + + class Meta: + model = CableBundle + fields = [ + 'id', 'url', 'display_url', 'display', 'name', 'description', 'owner', 'comments', 'tags', + 'custom_fields', 'created', 'last_updated', 'cable_count', + ] + brief_fields = ('id', 'url', 'display', 'name', 'description') + + class CableSerializer(PrimaryModelSerializer): a_terminations = GenericObjectSerializer(many=True, required=False) b_terminations = GenericObjectSerializer(many=True, required=False) @@ -31,12 +44,13 @@ class CableSerializer(PrimaryModelSerializer): profile = ChoiceField(choices=CableProfileChoices, required=False) tenant = TenantSerializer(nested=True, required=False, allow_null=True) length_unit = ChoiceField(choices=CableLengthUnitChoices, allow_blank=True, required=False, allow_null=True) + bundle = CableBundleSerializer(nested=True, required=False, allow_null=True, default=None) class Meta: model = Cable fields = [ 'id', 'url', 'display_url', 'display', 'type', 'a_terminations', 'b_terminations', 'status', 'profile', - 'tenant', 'label', 'color', 'length', 'length_unit', 'description', 'owner', 'comments', 'tags', + 'tenant', 'bundle', 'label', 'color', 'length', 'length_unit', 'description', 'owner', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'label', 'description') diff --git a/netbox/dcim/api/urls.py b/netbox/dcim/api/urls.py index 328e5ac0f..852a871bb 100644 --- a/netbox/dcim/api/urls.py +++ b/netbox/dcim/api/urls.py @@ -64,6 +64,7 @@ router.register('mac-addresses', views.MACAddressViewSet) # Cables router.register('cables', views.CableViewSet) router.register('cable-terminations', views.CableTerminationViewSet) +router.register('cable-bundles', views.CableBundleViewSet) # Virtual chassis router.register('virtual-chassis', views.VirtualChassisViewSet) diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index 96af81cf1..a1ab5e926 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -19,6 +19,7 @@ from netbox.api.pagination import StripCountAnnotationsPaginator from netbox.api.viewsets import MPTTLockedMixin, NetBoxModelViewSet, NetBoxReadOnlyModelViewSet from netbox.api.viewsets.mixins import SequentialBulkCreatesMixin from utilities.api import get_serializer_for_model +from utilities.query import count_related from utilities.query_functions import CollateAsChar from virtualization.models import VirtualMachine @@ -584,6 +585,14 @@ class CableTerminationViewSet(NetBoxReadOnlyModelViewSet): filterset_class = filtersets.CableTerminationFilterSet +class CableBundleViewSet(NetBoxModelViewSet): + queryset = CableBundle.objects.annotate( + cable_count=count_related(Cable, 'bundle') + ) + serializer_class = serializers.CableBundleSerializer + filterset_class = filtersets.CableBundleFilterSet + + # # Virtual chassis # diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 994d68674..e405129b8 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -45,6 +45,7 @@ from .constants import * from .models import * __all__ = ( + 'CableBundleFilterSet', 'CableFilterSet', 'CableTerminationFilterSet', 'CabledObjectFilterSet', @@ -2569,6 +2570,23 @@ class VirtualChassisFilterSet(PrimaryModelFilterSet): return queryset.filter(qs_filter).distinct() +@register_filterset +class CableBundleFilterSet(PrimaryModelFilterSet): + + class Meta: + model = CableBundle + fields = ('id', 'name', 'description') + + def search(self, queryset, name, value): + if not value.strip(): + return queryset + return queryset.filter( + Q(name__icontains=value) | + Q(description__icontains=value) | + Q(comments__icontains=value) + ) + + @register_filterset class CableFilterSet(TenancyFilterSet, PrimaryModelFilterSet): termination_a_type = MultiValueContentTypeFilter( @@ -2589,6 +2607,16 @@ class CableFilterSet(TenancyFilterSet, PrimaryModelFilterSet): method='_unterminated', label=_('Unterminated'), ) + bundle_id = django_filters.ModelMultipleChoiceFilter( + queryset=CableBundle.objects.all(), + label=_('Cable bundle (ID)'), + ) + bundle = django_filters.ModelMultipleChoiceFilter( + field_name='bundle__name', + queryset=CableBundle.objects.all(), + to_field_name='name', + label=_('Cable bundle (name)'), + ) type = django_filters.MultipleChoiceFilter( choices=CableTypeChoices, distinct=False, diff --git a/netbox/dcim/forms/bulk_edit.py b/netbox/dcim/forms/bulk_edit.py index fff3fcddf..aaea26eef 100644 --- a/netbox/dcim/forms/bulk_edit.py +++ b/netbox/dcim/forms/bulk_edit.py @@ -29,6 +29,7 @@ from wireless.models import WirelessLAN, WirelessLANGroup __all__ = ( 'CableBulkEditForm', + 'CableBundleBulkEditForm', 'ConsolePortBulkEditForm', 'ConsolePortTemplateBulkEditForm', 'ConsoleServerPortBulkEditForm', @@ -786,6 +787,24 @@ class ModuleBulkEditForm(PrimaryModelBulkEditForm): nullable_fields = ('serial', 'description', 'comments') +class CableBundleBulkEditForm(PrimaryModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=CableBundle.objects.all(), + widget=forms.MultipleHiddenInput + ) + description = forms.CharField( + label=_('Description'), + max_length=200, + required=False, + ) + + model = CableBundle + fieldsets = ( + FieldSet('description',), + ) + nullable_fields = ('description', 'comments') + + class CableBulkEditForm(PrimaryModelBulkEditForm): type = forms.ChoiceField( label=_('Type'), @@ -810,6 +829,11 @@ class CableBulkEditForm(PrimaryModelBulkEditForm): queryset=Tenant.objects.all(), required=False ) + bundle = DynamicModelChoiceField( + label=_('Bundle'), + queryset=CableBundle.objects.all(), + required=False, + ) label = forms.CharField( label=_('Label'), max_length=100, @@ -833,11 +857,11 @@ class CableBulkEditForm(PrimaryModelBulkEditForm): model = Cable fieldsets = ( - FieldSet('type', 'status', 'profile', 'tenant', 'label', 'description'), + FieldSet('type', 'status', 'profile', 'tenant', 'bundle', 'label', 'description'), FieldSet('color', 'length', 'length_unit', name=_('Attributes')), ) nullable_fields = ( - 'type', 'status', 'profile', 'tenant', 'label', 'color', 'length', 'description', 'comments', + 'type', 'status', 'profile', 'tenant', 'bundle', 'label', 'color', 'length', 'description', 'comments', ) diff --git a/netbox/dcim/forms/bulk_import.py b/netbox/dcim/forms/bulk_import.py index 1749153db..acdb0f638 100644 --- a/netbox/dcim/forms/bulk_import.py +++ b/netbox/dcim/forms/bulk_import.py @@ -34,6 +34,7 @@ from wireless.choices import WirelessRoleChoices from .common import ModuleCommonForm __all__ = ( + 'CableBundleImportForm', 'CableImportForm', 'ConsolePortImportForm', 'ConsoleServerPortImportForm', @@ -1412,6 +1413,12 @@ class MACAddressImportForm(PrimaryModelImportForm): # Cables # +class CableBundleImportForm(PrimaryModelImportForm): + class Meta: + model = CableBundle + fields = ('name', 'description', 'owner', 'comments', 'tags') + + class CableImportForm(PrimaryModelImportForm): # Termination A side_a_site = CSVModelChoiceField( @@ -1489,6 +1496,13 @@ class CableImportForm(PrimaryModelImportForm): to_field_name='name', help_text=_('Assigned tenant') ) + bundle = CSVModelChoiceField( + label=_('Bundle'), + queryset=CableBundle.objects.all(), + required=False, + to_field_name='name', + help_text=_('Cable bundle name'), + ) length_unit = CSVChoiceField( label=_('Length unit'), choices=CableLengthUnitChoices, @@ -1506,7 +1520,7 @@ class CableImportForm(PrimaryModelImportForm): model = Cable fields = [ 'side_a_site', 'side_a_device', 'side_a_type', 'side_a_name', 'side_b_site', 'side_b_device', 'side_b_type', - 'side_b_name', 'type', 'status', 'profile', 'tenant', 'label', 'color', 'length', 'length_unit', + 'side_b_name', 'type', 'status', 'profile', 'tenant', 'bundle', 'label', 'color', 'length', 'length_unit', 'description', 'owner', 'comments', 'tags', ] diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py index 9fbdb6010..b1a54842f 100644 --- a/netbox/dcim/forms/filtersets.py +++ b/netbox/dcim/forms/filtersets.py @@ -27,6 +27,7 @@ from vpn.models import L2VPN from wireless.choices import * __all__ = ( + 'CableBundleFilterForm', 'CableFilterForm', 'ConsoleConnectionFilterForm', 'ConsolePortFilterForm', @@ -1172,12 +1173,24 @@ class VirtualChassisFilterForm(TenancyFilterForm, PrimaryModelFilterSetForm): tag = TagFilterField(model) +class CableBundleFilterForm(PrimaryModelFilterSetForm): + model = CableBundle + fieldsets = ( + FieldSet('q', 'filter_id', 'tag'), + FieldSet('name', name=_('Attributes')), + ) + tag = TagFilterField(model) + + class CableFilterForm(TenancyFilterForm, PrimaryModelFilterSetForm): model = Cable fieldsets = ( FieldSet('q', 'filter_id', 'tag'), FieldSet('site_id', 'location_id', 'rack_id', 'device_id', name=_('Location')), - FieldSet('type', 'status', 'profile', 'color', 'length', 'length_unit', 'unterminated', name=_('Attributes')), + FieldSet( + 'type', 'status', 'profile', 'color', 'length', 'length_unit', 'unterminated', 'bundle_id', + name=_('Attributes'), + ), FieldSet('tenant_group_id', 'tenant_id', name=_('Tenant')), FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), ) @@ -1259,6 +1272,11 @@ class CableFilterForm(TenancyFilterForm, PrimaryModelFilterSetForm): choices=BOOLEAN_WITH_BLANK_CHOICES ) ) + bundle_id = DynamicModelMultipleChoiceField( + queryset=CableBundle.objects.all(), + required=False, + label=_('Bundle'), + ) tag = TagFilterField(model) diff --git a/netbox/dcim/forms/model_forms.py b/netbox/dcim/forms/model_forms.py index aedc30943..ca06b620b 100644 --- a/netbox/dcim/forms/model_forms.py +++ b/netbox/dcim/forms/model_forms.py @@ -39,6 +39,7 @@ from wireless.models import WirelessLAN, WirelessLANGroup from .common import InterfaceCommonForm, ModuleCommonForm __all__ = ( + 'CableBundleForm', 'CableForm', 'ConsolePortForm', 'ConsolePortTemplateForm', @@ -830,6 +831,17 @@ def get_termination_type_choices(): ]) +class CableBundleForm(PrimaryModelForm): + + fieldsets = ( + FieldSet('name', 'description', 'tags', name=_('Cable Bundle')), + ) + + class Meta: + model = CableBundle + fields = ['name', 'description', 'owner', 'comments', 'tags'] + + class CableForm(TenancyForm, PrimaryModelForm): a_terminations_type = forms.ChoiceField( choices=get_termination_type_choices, @@ -843,12 +855,17 @@ class CableForm(TenancyForm, PrimaryModelForm): widget=HTMXSelect(), label=_('Type') ) + bundle = DynamicModelChoiceField( + queryset=CableBundle.objects.all(), + required=False, + label=_('Bundle'), + ) class Meta: model = Cable fields = [ 'a_terminations_type', 'b_terminations_type', 'type', 'status', 'profile', 'tenant_group', 'tenant', - 'label', 'color', 'length', 'length_unit', 'description', 'owner', 'comments', 'tags', + 'bundle', 'label', 'color', 'length', 'length_unit', 'description', 'owner', 'comments', 'tags', ] diff --git a/netbox/dcim/graphql/filters.py b/netbox/dcim/graphql/filters.py index 191e9a8fd..85a7dfdf5 100644 --- a/netbox/dcim/graphql/filters.py +++ b/netbox/dcim/graphql/filters.py @@ -57,6 +57,7 @@ if TYPE_CHECKING: from .enums import * __all__ = ( + 'CableBundleFilter', 'CableFilter', 'CableTerminationFilter', 'ConsolePortFilter', @@ -107,6 +108,11 @@ __all__ = ( ) +@strawberry_django.filter_type(models.CableBundle, lookups=True) +class CableBundleFilter(PrimaryModelFilter): + name: StrFilterLookup[str] | None = strawberry_django.filter_field() + + @strawberry_django.filter_type(models.Cable, lookups=True) class CableFilter(TenancyFilterMixin, PrimaryModelFilter): type: BaseFilterLookup[Annotated['CableTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = ( diff --git a/netbox/dcim/graphql/schema.py b/netbox/dcim/graphql/schema.py index 1ee426a91..710254120 100644 --- a/netbox/dcim/graphql/schema.py +++ b/netbox/dcim/graphql/schema.py @@ -9,6 +9,9 @@ class DCIMQuery: cable: CableType = strawberry_django.field() cable_list: list[CableType] = strawberry_django.field() + cable_bundle: CableBundleType = strawberry_django.field() + cable_bundle_list: list[CableBundleType] = strawberry_django.field() + console_port: ConsolePortType = strawberry_django.field() console_port_list: list[ConsolePortType] = strawberry_django.field() diff --git a/netbox/dcim/graphql/types.py b/netbox/dcim/graphql/types.py index 49aa18076..b6af83cb0 100644 --- a/netbox/dcim/graphql/types.py +++ b/netbox/dcim/graphql/types.py @@ -39,6 +39,7 @@ if TYPE_CHECKING: from wireless.graphql.types import WirelessLANType, WirelessLinkType __all__ = ( + 'CableBundleType', 'CableType', 'ComponentType', 'ConsolePortTemplateType', @@ -127,6 +128,16 @@ class ModularComponentTemplateType(ComponentTemplateType): # +@strawberry_django.type( + models.CableBundle, + fields='__all__', + filters=CableBundleFilter, + pagination=True +) +class CableBundleType(PrimaryObjectType): + cables: list[Annotated['CableType', strawberry.lazy('dcim.graphql.types')]] + + @strawberry_django.type( models.CableTermination, exclude=['termination_type', 'termination_id', '_device', '_rack', '_location', '_site'], @@ -158,6 +169,7 @@ class CableTerminationType(NetBoxObjectType): class CableType(PrimaryObjectType): color: str tenant: Annotated['TenantType', strawberry.lazy('tenancy.graphql.types')] | None + bundle: Annotated['CableBundleType', strawberry.lazy('dcim.graphql.types')] | None terminations: list[CableTerminationType] diff --git a/netbox/dcim/migrations/0228_cable_bundle.py b/netbox/dcim/migrations/0228_cable_bundle.py new file mode 100644 index 000000000..18c3a67f4 --- /dev/null +++ b/netbox/dcim/migrations/0228_cable_bundle.py @@ -0,0 +1,54 @@ +import django.db.models.deletion +import taggit.managers +from django.db import migrations, models + +import netbox.models.deletion +import utilities.json + + +class Migration(migrations.Migration): + + dependencies = [ + ('dcim', '0227_rack_group'), + ('extras', '0134_owner'), + ('users', '0015_owner'), + ] + + operations = [ + migrations.CreateModel( + name='CableBundle', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True, null=True)), + ('last_updated', models.DateTimeField(auto_now=True, null=True)), + ('custom_field_data', models.JSONField( + blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder) + ), + ('description', models.CharField(blank=True, max_length=200)), + ('comments', models.TextField(blank=True)), + ('name', models.CharField(max_length=100, unique=True)), + ('owner', models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='users.owner') + ), + ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), + ], + options={ + 'verbose_name': 'cable bundle', + 'verbose_name_plural': 'cable bundles', + 'ordering': ('name',), + }, + bases=(netbox.models.deletion.DeleteMixin, models.Model), + ), + migrations.AddField( + model_name='cable', + name='bundle', + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name='cables', + to='dcim.cablebundle', + verbose_name='bundle', + ), + ), + ] diff --git a/netbox/dcim/models/cables.py b/netbox/dcim/models/cables.py index 585b18687..17848e2d8 100644 --- a/netbox/dcim/models/cables.py +++ b/netbox/dcim/models/cables.py @@ -8,6 +8,7 @@ from django.core.exceptions import ValidationError from django.core.validators import MaxValueValidator, MinValueValidator from django.db import models from django.dispatch import Signal +from django.urls import reverse from django.utils.translation import gettext_lazy as _ from core.models import ObjectType @@ -29,6 +30,7 @@ from .device_components import FrontPort, PathEndpoint, PortMapping, RearPort __all__ = ( 'Cable', + 'CableBundle', 'CablePath', 'CableTermination', ) @@ -38,6 +40,32 @@ logger = logging.getLogger(f'netbox.{__name__}') trace_paths = Signal() +# +# Cable bundles +# + +class CableBundle(PrimaryModel): + """ + A logical grouping of individual cables. + """ + name = models.CharField( + verbose_name=_('name'), + max_length=100, + unique=True, + ) + + class Meta: + ordering = ('name',) + verbose_name = _('cable bundle') + verbose_name_plural = _('cable bundles') + + def __str__(self): + return self.name + + def get_absolute_url(self): + return reverse('dcim:cablebundle', args=[self.pk]) + + # # Cables # @@ -102,8 +130,16 @@ class Cable(PrimaryModel): blank=True, null=True ) + bundle = models.ForeignKey( + to='dcim.CableBundle', + on_delete=models.SET_NULL, + related_name='cables', + blank=True, + null=True, + verbose_name=_('bundle'), + ) - clone_fields = ('tenant', 'type', 'profile') + clone_fields = ('tenant', 'type', 'profile', 'bundle') class Meta: ordering = ('pk',) diff --git a/netbox/dcim/search.py b/netbox/dcim/search.py index fa5cb9156..3eebc6952 100644 --- a/netbox/dcim/search.py +++ b/netbox/dcim/search.py @@ -3,6 +3,17 @@ from netbox.search import SearchIndex, register_search from . import models +@register_search +class CableBundleIndex(SearchIndex): + model = models.CableBundle + fields = ( + ('name', 100), + ('description', 500), + ('comments', 5000), + ) + display_attrs = ('description',) + + @register_search class CableIndex(SearchIndex): model = models.Cable diff --git a/netbox/dcim/tables/cables.py b/netbox/dcim/tables/cables.py index 06c1b3056..29c01ff48 100644 --- a/netbox/dcim/tables/cables.py +++ b/netbox/dcim/tables/cables.py @@ -4,13 +4,14 @@ from django.utils.safestring import mark_safe from django.utils.translation import gettext_lazy as _ from django_tables2.utils import Accessor -from dcim.models import Cable +from dcim.models import Cable, CableBundle from netbox.tables import PrimaryModelTable, columns from tenancy.tables import TenancyColumnsMixin from .template_code import CABLE_LENGTH __all__ = ( + 'CableBundleTable', 'CableTable', ) @@ -119,6 +120,10 @@ class CableTable(TenancyColumnsMixin, PrimaryModelTable): verbose_name=_('Color Name'), orderable=False ) + bundle = tables.Column( + verbose_name=_('Bundle'), + linkify=True, + ) tags = columns.TagColumn( url_name='dcim:cable_list' ) @@ -128,8 +133,30 @@ class CableTable(TenancyColumnsMixin, PrimaryModelTable): fields = ( 'pk', 'id', 'label', 'a_terminations', 'b_terminations', 'device_a', 'device_b', 'rack_a', 'rack_b', 'location_a', 'location_b', 'site_a', 'site_b', 'status', 'profile', 'type', 'tenant', 'tenant_group', - 'color', 'color_name', 'length', 'description', 'comments', 'tags', 'created', 'last_updated', + 'color', 'color_name', 'bundle', 'length', 'description', 'comments', 'tags', 'created', 'last_updated', ) default_columns = ( 'pk', 'id', 'label', 'a_terminations', 'b_terminations', 'status', 'type', ) + + +class CableBundleTable(PrimaryModelTable): + name = tables.Column( + verbose_name=_('Name'), + linkify=True, + ) + cable_count = tables.Column( + verbose_name=_('Cables'), + ) + tags = columns.TagColumn( + url_name='dcim:cablebundle_list' + ) + + class Meta(PrimaryModelTable.Meta): + model = CableBundle + fields = ( + 'pk', 'id', 'name', 'cable_count', 'description', 'tags', 'created', 'last_updated', + ) + default_columns = ( + 'pk', 'id', 'name', 'cable_count', 'description', + ) diff --git a/netbox/dcim/tests/test_api.py b/netbox/dcim/tests/test_api.py index e0289a595..326678bfa 100644 --- a/netbox/dcim/tests/test_api.py +++ b/netbox/dcim/tests/test_api.py @@ -2799,6 +2799,60 @@ class InventoryItemRoleTest(APIViewTestCases.APIViewTestCase): InventoryItemRole.objects.bulk_create(roles) +class CableBundleTest(APIViewTestCases.APIViewTestCase): + model = CableBundle + brief_fields = ['description', 'display', 'id', 'name', 'url'] + create_data = [ + {'name': 'Cable Bundle 4'}, + {'name': 'Cable Bundle 5'}, + {'name': 'Cable Bundle 6'}, + ] + bulk_update_data = { + 'description': 'New description', + } + + @classmethod + def setUpTestData(cls): + cable_bundles = ( + CableBundle(name='Cable Bundle 1'), + CableBundle(name='Cable Bundle 2'), + CableBundle(name='Cable Bundle 3'), + ) + CableBundle.objects.bulk_create(cable_bundles) + + def test_cable_count(self): + """cable_count annotation is returned correctly in the API response.""" + self.add_permissions('dcim.view_cablebundle') + bundle = CableBundle.objects.first() + + site = Site.objects.create(name='CB Test Site', slug='cb-test-site') + manufacturer = Manufacturer.objects.create(name='CB Manufacturer', slug='cb-manufacturer') + device_type = DeviceType.objects.create( + manufacturer=manufacturer, model='CB Device Type', slug='cb-device-type' + ) + role = DeviceRole.objects.create(name='CB Role', slug='cb-role', color='ff0000') + devices = ( + Device(device_type=device_type, role=role, name='CB Device 1', site=site), + Device(device_type=device_type, role=role, name='CB Device 2', site=site), + ) + Device.objects.bulk_create(devices) + interfaces = ( + Interface(device=devices[0], name='eth0', type=InterfaceTypeChoices.TYPE_1GE_FIXED), + Interface(device=devices[0], name='eth1', type=InterfaceTypeChoices.TYPE_1GE_FIXED), + Interface(device=devices[1], name='eth0', type=InterfaceTypeChoices.TYPE_1GE_FIXED), + Interface(device=devices[1], name='eth1', type=InterfaceTypeChoices.TYPE_1GE_FIXED), + ) + Interface.objects.bulk_create(interfaces) + for a, b in [(interfaces[0], interfaces[2]), (interfaces[1], interfaces[3])]: + cable = Cable(a_terminations=[a], b_terminations=[b], bundle=bundle) + cable.save() + + url = reverse('dcim-api:cablebundle-detail', kwargs={'pk': bundle.pk}) + response = self.client.get(url, **self.header) + self.assertHttpStatus(response, status.HTTP_200_OK) + self.assertEqual(response.data['cable_count'], 2) + + class CableTest(APIViewTestCases.APIViewTestCase): model = Cable brief_fields = ['description', 'display', 'id', 'label', 'url'] diff --git a/netbox/dcim/tests/test_filtersets.py b/netbox/dcim/tests/test_filtersets.py index d4a53bca2..8afb4d05f 100644 --- a/netbox/dcim/tests/test_filtersets.py +++ b/netbox/dcim/tests/test_filtersets.py @@ -6471,6 +6471,32 @@ class VirtualChassisTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) +class CableBundleTestCase(TestCase, ChangeLoggedFilterSetTests): + queryset = CableBundle.objects.all() + filterset = CableBundleFilterSet + + @classmethod + def setUpTestData(cls): + cable_bundles = ( + CableBundle(name='Cable Bundle 1', description='foobar1'), + CableBundle(name='Cable Bundle 2', description='foobar2'), + CableBundle(name='Cable Bundle 3'), + ) + CableBundle.objects.bulk_create(cable_bundles) + + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + + def test_name(self): + params = {'name': ['Cable Bundle 1', 'Cable Bundle 2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + class CableTestCase(TestCase, ChangeLoggedFilterSetTests): queryset = Cable.objects.all() filterset = CableFilterSet diff --git a/netbox/dcim/tests/test_views.py b/netbox/dcim/tests/test_views.py index c90e6a91b..3f7e90952 100644 --- a/netbox/dcim/tests/test_views.py +++ b/netbox/dcim/tests/test_views.py @@ -3547,6 +3547,45 @@ class InventoryItemRoleTestCase(ViewTestCases.OrganizationalObjectViewTestCase): } +class CableBundleTestCase(ViewTestCases.PrimaryObjectViewTestCase): + model = CableBundle + + @classmethod + def setUpTestData(cls): + cable_bundles = ( + CableBundle(name='Cable Bundle 1'), + CableBundle(name='Cable Bundle 2'), + CableBundle(name='Cable Bundle 3'), + ) + CableBundle.objects.bulk_create(cable_bundles) + + tags = create_tags('Alpha', 'Bravo', 'Charlie') + + cls.form_data = { + 'name': 'Cable Bundle X', + 'description': 'A test bundle', + 'tags': [t.pk for t in tags], + } + + cls.csv_data = ( + "name,description", + "Cable Bundle 4,Fourth bundle", + "Cable Bundle 5,Fifth bundle", + "Cable Bundle 6,", + ) + + cls.csv_update_data = ( + "id,name,description", + f"{cable_bundles[0].pk},Cable Bundle 7,New description7", + f"{cable_bundles[1].pk},Cable Bundle 8,New description8", + f"{cable_bundles[2].pk},Cable Bundle 9,New description9", + ) + + cls.bulk_edit_data = { + 'description': 'New description', + } + + # TODO: Change base class to PrimaryObjectViewTestCase # Blocked by lack of common creation view for cables (termination A must be initialized) class CableTestCase( diff --git a/netbox/dcim/urls.py b/netbox/dcim/urls.py index f3e1d6675..86cf79924 100644 --- a/netbox/dcim/urls.py +++ b/netbox/dcim/urls.py @@ -153,6 +153,9 @@ urlpatterns = [ path('cables/', include(get_model_urls('dcim', 'cable', detail=False))), path('cables//', include(get_model_urls('dcim', 'cable'))), + path('cable-bundles/', include(get_model_urls('dcim', 'cablebundle', detail=False))), + path('cable-bundles//', include(get_model_urls('dcim', 'cablebundle'))), + # Console/power/interface connections (read-only) path('console-connections/', views.ConsoleConnectionsListView.as_view(), name='console_connections_list'), path('power-connections/', views.PowerConnectionsListView.as_view(), name='power_connections_list'), diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index ebcf60ec8..b9a324b02 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -4017,6 +4017,72 @@ class DeviceBulkAddInventoryItemView(generic.BulkComponentCreateView): default_return_url = 'dcim:device_list' +# +# Cable bundles +# + +@register_model_view(CableBundle, 'list', path='', detail=False) +class CableBundleListView(generic.ObjectListView): + queryset = CableBundle.objects.annotate( + cable_count=count_related(Cable, 'bundle') + ) + filterset = filtersets.CableBundleFilterSet + filterset_form = forms.CableBundleFilterForm + table = tables.CableBundleTable + + +@register_model_view(CableBundle) +class CableBundleView(generic.ObjectView): + queryset = CableBundle.objects.all() + + def get_extra_context(self, request, instance): + cables_table = tables.CableTable( + instance.cables.all().prefetch_related( + 'terminations__termination', 'terminations___device', 'terminations___rack', 'terminations___location', + 'terminations___site', + ), + orderable=False, + ) + cables_table.configure(request) + + return { + 'cables_table': cables_table, + } + + +@register_model_view(CableBundle, 'add', detail=False) +@register_model_view(CableBundle, 'edit') +class CableBundleEditView(generic.ObjectEditView): + queryset = CableBundle.objects.all() + form = forms.CableBundleForm + + +@register_model_view(CableBundle, 'delete') +class CableBundleDeleteView(generic.ObjectDeleteView): + queryset = CableBundle.objects.all() + + +@register_model_view(CableBundle, 'bulk_import', path='import', detail=False) +class CableBundleBulkImportView(generic.BulkImportView): + queryset = CableBundle.objects.all() + model_form = forms.CableBundleImportForm + + +@register_model_view(CableBundle, 'bulk_edit', path='edit', detail=False) +class CableBundleBulkEditView(generic.BulkEditView): + queryset = CableBundle.objects.all() + filterset = filtersets.CableBundleFilterSet + table = tables.CableBundleTable + form = forms.CableBundleBulkEditForm + + +@register_model_view(CableBundle, 'bulk_delete', path='delete', detail=False) +class CableBundleBulkDeleteView(generic.BulkDeleteView): + queryset = CableBundle.objects.all() + filterset = filtersets.CableBundleFilterSet + table = tables.CableBundleTable + + # # Cables # diff --git a/netbox/extras/tests/test_filtersets.py b/netbox/extras/tests/test_filtersets.py index 0e6237f5f..56e7f27f7 100644 --- a/netbox/extras/tests/test_filtersets.py +++ b/netbox/extras/tests/test_filtersets.py @@ -1223,6 +1223,7 @@ class TagTestCase(TestCase, ChangeLoggedFilterSetTests): 'asn', 'asnrange', 'cable', + 'cablebundle', 'circuit', 'circuitgroup', 'circuitgroupassignment', diff --git a/netbox/netbox/navigation/menu.py b/netbox/netbox/navigation/menu.py index 0e0fa31d0..399997593 100644 --- a/netbox/netbox/navigation/menu.py +++ b/netbox/netbox/navigation/menu.py @@ -131,6 +131,7 @@ CONNECTIONS_MENU = Menu( label=_('Connections'), items=( get_model_item('dcim', 'cable', _('Cables')), + get_model_item('dcim', 'cablebundle', _('Cable Bundles')), get_model_item('wireless', 'wirelesslink', _('Wireless Links')), MenuItem( link='dcim:interface_connections_list', diff --git a/netbox/templates/dcim/cable.html b/netbox/templates/dcim/cable.html index 8e685c514..42857a990 100644 --- a/netbox/templates/dcim/cable.html +++ b/netbox/templates/dcim/cable.html @@ -32,6 +32,10 @@ {{ object.tenant|linkify|placeholder }} + + {% trans "Bundle" %} + {{ object.bundle|linkify|placeholder }} + {% trans "Label" %} {{ object.label|placeholder }} diff --git a/netbox/templates/dcim/cablebundle.html b/netbox/templates/dcim/cablebundle.html new file mode 100644 index 000000000..cb1237f2a --- /dev/null +++ b/netbox/templates/dcim/cablebundle.html @@ -0,0 +1,41 @@ +{% extends 'generic/object.html' %} +{% load helpers %} +{% load plugins %} +{% load i18n %} + +{% block breadcrumbs %} + +{% endblock %} + +{% block content %} +
+
+
+

{% trans "Cable Bundle" %}

+ + + + + + + + + +
{% trans "Name" %}{{ object.name }}
{% trans "Description" %}{{ object.description|placeholder }}
+
+ {% include 'inc/panels/custom_fields.html' %} + {% include 'inc/panels/tags.html' %} + {% include 'inc/panels/comments.html' %} + {% plugin_left_page object %} +
+
+ {% plugin_right_page object %} +
+
+
+
+ {% include 'inc/panel_table.html' with table=cables_table heading=_('Cables') %} + {% plugin_full_width_page object %} +
+
+{% endblock %} diff --git a/netbox/templates/dcim/htmx/cable_edit.html b/netbox/templates/dcim/htmx/cable_edit.html index 45d528217..056c1679c 100644 --- a/netbox/templates/dcim/htmx/cable_edit.html +++ b/netbox/templates/dcim/htmx/cable_edit.html @@ -55,6 +55,7 @@ {% render_field form.status %} {% render_field form.profile %} {% render_field form.type %} + {% render_field form.bundle %} {% render_field form.label %} {% render_field form.description %} {% render_field form.color %} From 625c4eb5bb7ddcb704f2f6170fa7651e9a363d2f Mon Sep 17 00:00:00 2001 From: Martin Hauser Date: Wed, 11 Mar 2026 20:51:23 +0100 Subject: [PATCH 019/104] feat(dcim): Add enabled field to Module and Device bays Add an `enabled` boolean field to ModuleBay, ModuleBayTemplate, DeviceBay, and DeviceBayTemplate models. Disabled bays prevent component installation and display accordingly in the UI. Update serializers, filters, forms, and tables to support the new field. Fixes #20152 --- docs/models/dcim/devicebay.md | 5 + docs/models/dcim/modulebay.md | 7 +- .../api/serializers_/device_components.py | 14 +- .../api/serializers_/devicetype_components.py | 8 +- netbox/dcim/filtersets.py | 8 +- netbox/dcim/forms/bulk_create.py | 16 ++- netbox/dcim/forms/bulk_edit.py | 18 ++- netbox/dcim/forms/bulk_import.py | 16 ++- netbox/dcim/forms/filtersets.py | 30 ++++- netbox/dcim/forms/model_forms.py | 18 +-- netbox/dcim/graphql/filters.py | 5 +- .../0229_devicebay_modulebay_enabled.py | 30 +++++ .../dcim/models/device_component_templates.py | 15 ++- netbox/dcim/models/device_components.py | 36 ++++- netbox/dcim/models/modules.py | 8 ++ netbox/dcim/tables/devices.py | 34 +++-- netbox/dcim/tables/devicetypes.py | 10 +- netbox/dcim/tables/template_code.py | 4 +- netbox/dcim/tests/test_api.py | 35 ++--- netbox/dcim/tests/test_filtersets.py | 69 ++++++++-- netbox/dcim/tests/test_models.py | 125 ++++++++++++++++++ 21 files changed, 423 insertions(+), 88 deletions(-) create mode 100644 netbox/dcim/migrations/0229_devicebay_modulebay_enabled.py diff --git a/docs/models/dcim/devicebay.md b/docs/models/dcim/devicebay.md index 5bbb125f8..9b19aee1e 100644 --- a/docs/models/dcim/devicebay.md +++ b/docs/models/dcim/devicebay.md @@ -23,3 +23,8 @@ The device bay's name. Must be unique to the parent device. ### Label An alternative physical label identifying the device bay. + +### Enabled + +Whether this device bay is enabled. Disabled device bays are not available for installation. + diff --git a/docs/models/dcim/modulebay.md b/docs/models/dcim/modulebay.md index 494012a7b..d42828b83 100644 --- a/docs/models/dcim/modulebay.md +++ b/docs/models/dcim/modulebay.md @@ -1,6 +1,6 @@ # Module Bays -Module bays represent a space or slot within a device in which a field-replaceable [module](./module.md) may be installed. A common example is that of a chassis-based switch such as the Cisco Nexus 9000 or Juniper EX9200. Modules in turn hold additional components that become available to the parent device. +Module bays represent a space or slot within a device in which a field-replaceable [module](./module.md) may be installed. A common example is that of a chassis-based switch such as the Cisco Nexus 9000 or Juniper EX9200. Modules, in turn, hold additional components that become available to the parent device. !!! note If you need to model child devices rather than modules, use a [device bay](./devicebay.md) instead. @@ -29,3 +29,8 @@ An alternative physical label identifying the module bay. ### Position The numeric position in which this module bay is situated. For example, this would be the number assigned to a slot within a chassis-based switch. + +### Enabled + +Whether this module bay is enabled. Disabled module bays are not available for installation. + diff --git a/netbox/dcim/api/serializers_/device_components.py b/netbox/dcim/api/serializers_/device_components.py index 09a850ad5..60e624a71 100644 --- a/netbox/dcim/api/serializers_/device_components.py +++ b/netbox/dcim/api/serializers_/device_components.py @@ -423,27 +423,29 @@ class ModuleBaySerializer(OwnerMixin, NetBoxModelSerializer): required=False, allow_null=True ) + _occupied = serializers.BooleanField(required=False, read_only=True) class Meta: model = ModuleBay fields = [ - 'id', 'url', 'display_url', 'display', 'device', 'module', 'name', 'installed_module', 'label', 'position', - 'description', 'owner', 'tags', 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'device', 'module', 'name', 'label', 'position', 'enabled', + 'description', 'installed_module', 'owner', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied', ] - brief_fields = ('id', 'url', 'display', 'installed_module', 'name', 'description') + brief_fields = ('id', 'url', 'display', 'installed_module', 'name', 'enabled', 'description', '_occupied') class DeviceBaySerializer(OwnerMixin, NetBoxModelSerializer): device = DeviceSerializer(nested=True) installed_device = DeviceSerializer(nested=True, required=False, allow_null=True) + _occupied = serializers.BooleanField(required=False, read_only=True) class Meta: model = DeviceBay fields = [ - 'id', 'url', 'display_url', 'display', 'device', 'name', 'label', 'description', 'installed_device', - 'owner', 'tags', 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'device', 'name', 'label', 'enabled', 'description', + 'installed_device', 'owner', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied', ] - brief_fields = ('id', 'url', 'display', 'device', 'name', 'description') + brief_fields = ('id', 'url', 'display', 'device', 'name', 'enabled', 'description', '_occupied',) class InventoryItemSerializer(OwnerMixin, NetBoxModelSerializer): diff --git a/netbox/dcim/api/serializers_/devicetype_components.py b/netbox/dcim/api/serializers_/devicetype_components.py index 147bc1701..b9b9c95ee 100644 --- a/netbox/dcim/api/serializers_/devicetype_components.py +++ b/netbox/dcim/api/serializers_/devicetype_components.py @@ -317,10 +317,10 @@ class ModuleBayTemplateSerializer(ComponentTemplateSerializer): class Meta: model = ModuleBayTemplate fields = [ - 'id', 'url', 'display', 'device_type', 'module_type', 'name', 'label', 'position', 'description', + 'id', 'url', 'display', 'device_type', 'module_type', 'name', 'label', 'position', 'enabled', 'description', 'created', 'last_updated', ] - brief_fields = ('id', 'url', 'display', 'name', 'description') + brief_fields = ('id', 'url', 'display', 'name', 'enabled', 'description') class DeviceBayTemplateSerializer(ComponentTemplateSerializer): @@ -331,10 +331,10 @@ class DeviceBayTemplateSerializer(ComponentTemplateSerializer): class Meta: model = DeviceBayTemplate fields = [ - 'id', 'url', 'display', 'device_type', 'name', 'label', 'description', + 'id', 'url', 'display', 'device_type', 'name', 'label', 'enabled', 'description', 'created', 'last_updated' ] - brief_fields = ('id', 'url', 'display', 'name', 'description') + brief_fields = ('id', 'url', 'display', 'name', 'enabled', 'description') class InventoryItemTemplateSerializer(ComponentTemplateSerializer): diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index e405129b8..08275554b 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -1032,7 +1032,7 @@ class ModuleBayTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeCo class Meta: model = ModuleBayTemplate - fields = ('id', 'name', 'label', 'position', 'description') + fields = ('id', 'name', 'label', 'position', 'enabled', 'description') @register_filterset @@ -1040,7 +1040,7 @@ class DeviceBayTemplateFilterSet(ChangeLoggedModelFilterSet, DeviceTypeComponent class Meta: model = DeviceBayTemplate - fields = ('id', 'name', 'label', 'description') + fields = ('id', 'name', 'label', 'enabled', 'description') @register_filterset @@ -2397,7 +2397,7 @@ class ModuleBayFilterSet(ModularDeviceComponentFilterSet): class Meta: model = ModuleBay - fields = ('id', 'name', 'label', 'position', 'description') + fields = ('id', 'name', 'label', 'position', 'enabled', 'description') @register_filterset @@ -2417,7 +2417,7 @@ class DeviceBayFilterSet(DeviceComponentFilterSet): class Meta: model = DeviceBay - fields = ('id', 'name', 'label', 'description') + fields = ('id', 'name', 'label', 'enabled', 'description') @register_filterset diff --git a/netbox/dcim/forms/bulk_create.py b/netbox/dcim/forms/bulk_create.py index bfa492111..a13b2bf38 100644 --- a/netbox/dcim/forms/bulk_create.py +++ b/netbox/dcim/forms/bulk_create.py @@ -108,10 +108,13 @@ class RearPortBulkCreateForm( field_order = ('name', 'label', 'type', 'positions', 'mark_connected', 'description', 'tags') -class ModuleBayBulkCreateForm(DeviceBulkAddComponentForm): +class ModuleBayBulkCreateForm( + form_from_model(ModuleBay, ['enabled']), + DeviceBulkAddComponentForm +): model = ModuleBay - field_order = ('name', 'label', 'position', 'description', 'tags') - replication_fields = ('name', 'label', 'position') + field_order = ('name', 'label', 'position', 'enabled', 'description', 'tags') + replication_fields = ('name', 'label', 'position', 'enabled') position = ExpandableNameField( label=_('Position'), required=False, @@ -119,9 +122,12 @@ class ModuleBayBulkCreateForm(DeviceBulkAddComponentForm): ) -class DeviceBayBulkCreateForm(DeviceBulkAddComponentForm): +class DeviceBayBulkCreateForm( + form_from_model(DeviceBay, ['enabled']), + DeviceBulkAddComponentForm +): model = DeviceBay - field_order = ('name', 'label', 'description', 'tags') + field_order = ('name', 'label', 'enabled', 'description', 'tags') class InventoryItemBulkCreateForm( diff --git a/netbox/dcim/forms/bulk_edit.py b/netbox/dcim/forms/bulk_edit.py index aaea26eef..6dfa4884e 100644 --- a/netbox/dcim/forms/bulk_edit.py +++ b/netbox/dcim/forms/bulk_edit.py @@ -1245,6 +1245,11 @@ class ModuleBayTemplateBulkEditForm(ComponentTemplateBulkEditForm): label=_('Description'), required=False ) + enabled = forms.NullBooleanField( + label=_('Enabled'), + required=False, + widget=BulkEditNullBooleanSelect, + ) nullable_fields = ('label', 'position', 'description') @@ -1263,6 +1268,11 @@ class DeviceBayTemplateBulkEditForm(ComponentTemplateBulkEditForm): label=_('Description'), required=False ) + enabled = forms.NullBooleanField( + label=_('Enabled'), + required=False, + widget=BulkEditNullBooleanSelect, + ) nullable_fields = ('label', 'description') @@ -1687,23 +1697,23 @@ class RearPortBulkEditForm( class ModuleBayBulkEditForm( - form_from_model(ModuleBay, ['label', 'position', 'description']), + form_from_model(ModuleBay, ['label', 'position', 'enabled', 'description']), NetBoxModelBulkEditForm ): model = ModuleBay fieldsets = ( - FieldSet('label', 'position', 'description'), + FieldSet('label', 'position', 'enabled', 'description'), ) nullable_fields = ('label', 'position', 'description') class DeviceBayBulkEditForm( - form_from_model(DeviceBay, ['label', 'description']), + form_from_model(DeviceBay, ['label', 'enabled', 'description']), NetBoxModelBulkEditForm ): model = DeviceBay fieldsets = ( - FieldSet('label', 'description'), + FieldSet('label', 'enabled', 'description'), ) nullable_fields = ('label', 'description') diff --git a/netbox/dcim/forms/bulk_import.py b/netbox/dcim/forms/bulk_import.py index acdb0f638..ec60c394a 100644 --- a/netbox/dcim/forms/bulk_import.py +++ b/netbox/dcim/forms/bulk_import.py @@ -1154,7 +1154,13 @@ class ModuleBayImportForm(OwnerCSVMixin, NetBoxModelImportForm): class Meta: model = ModuleBay - fields = ('device', 'name', 'label', 'position', 'description', 'owner', 'tags') + fields = ('device', 'name', 'label', 'position', 'enabled', 'description', 'owner', 'tags') + + def clean_enabled(self): + # Make sure enabled is True when it's not included in the uploaded data + if 'enabled' not in self.data: + return True + return self.cleaned_data['enabled'] class DeviceBayImportForm(OwnerCSVMixin, NetBoxModelImportForm): @@ -1176,7 +1182,7 @@ class DeviceBayImportForm(OwnerCSVMixin, NetBoxModelImportForm): class Meta: model = DeviceBay - fields = ('device', 'name', 'label', 'installed_device', 'description', 'owner', 'tags') + fields = ('device', 'name', 'label', 'enabled', 'installed_device', 'description', 'owner', 'tags') def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -1204,6 +1210,12 @@ class DeviceBayImportForm(OwnerCSVMixin, NetBoxModelImportForm): else: self.fields['installed_device'].queryset = Device.objects.none() + def clean_enabled(self): + # Make sure enabled is True when it's not included in the uploaded data + if 'enabled' not in self.data: + return True + return self.cleaned_data['enabled'] + class InventoryItemImportForm(OwnerCSVMixin, NetBoxModelImportForm): device = CSVModelChoiceField( diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py index b1a54842f..1584a09cc 100644 --- a/netbox/dcim/forms/filtersets.py +++ b/netbox/dcim/forms/filtersets.py @@ -1870,7 +1870,7 @@ class ModuleBayFilterForm(DeviceComponentFilterForm): model = ModuleBay fieldsets = ( FieldSet('q', 'filter_id', 'tag'), - FieldSet('name', 'label', 'position', name=_('Attributes')), + FieldSet('name', 'label', 'position', 'enabled', name=_('Attributes')), FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id', name=_('Location')), FieldSet( 'tenant_id', 'device_type_id', 'device_role_id', 'device_id', 'device_status', 'virtual_chassis_id', @@ -1878,31 +1878,41 @@ class ModuleBayFilterForm(DeviceComponentFilterForm): ), FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), ) - tag = TagFilterField(model) position = forms.CharField( label=_('Position'), required=False ) + enabled = forms.NullBooleanField( + label=_('Enabled'), + required=False, + widget=forms.Select(choices=BOOLEAN_WITH_BLANK_CHOICES), + ) + tag = TagFilterField(model) class ModuleBayTemplateFilterForm(ModularDeviceComponentTemplateFilterForm): model = ModuleBayTemplate fieldsets = ( FieldSet('q', 'filter_id', 'tag'), - FieldSet('name', 'label', 'position', name=_('Attributes')), + FieldSet('name', 'label', 'position', 'enabled', name=_('Attributes')), FieldSet('device_type_id', 'module_type_id', name=_('Device')), ) position = forms.CharField( label=_('Position'), required=False, ) + enabled = forms.NullBooleanField( + label=_('Enabled'), + required=False, + widget=forms.Select(choices=BOOLEAN_WITH_BLANK_CHOICES), + ) class DeviceBayFilterForm(DeviceComponentFilterForm): model = DeviceBay fieldsets = ( FieldSet('q', 'filter_id', 'tag'), - FieldSet('name', 'label', name=_('Attributes')), + FieldSet('name', 'label', 'enabled', name=_('Attributes')), FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id', name=_('Location')), FieldSet( 'tenant_id', 'device_type_id', 'device_role_id', 'device_id', 'device_status', 'virtual_chassis_id', @@ -1910,6 +1920,11 @@ class DeviceBayFilterForm(DeviceComponentFilterForm): ), FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), ) + enabled = forms.NullBooleanField( + label=_('Enabled'), + required=False, + widget=forms.Select(choices=BOOLEAN_WITH_BLANK_CHOICES), + ) tag = TagFilterField(model) @@ -1917,9 +1932,14 @@ class DeviceBayTemplateFilterForm(DeviceComponentTemplateFilterForm): model = DeviceBayTemplate fieldsets = ( FieldSet('q', 'filter_id', 'tag'), - FieldSet('name', 'label', name=_('Attributes')), + FieldSet('name', 'label', 'enabled', name=_('Attributes')), FieldSet('device_type_id', name=_('Device')), ) + enabled = forms.NullBooleanField( + label=_('Enabled'), + required=False, + widget=forms.Select(choices=BOOLEAN_WITH_BLANK_CHOICES), + ) class InventoryItemFilterForm(DeviceComponentFilterForm): diff --git a/netbox/dcim/forms/model_forms.py b/netbox/dcim/forms/model_forms.py index ca06b620b..dd00418b5 100644 --- a/netbox/dcim/forms/model_forms.py +++ b/netbox/dcim/forms/model_forms.py @@ -777,7 +777,7 @@ class ModuleForm(ModuleCommonForm, PrimaryModelForm): 'device_id': '$device', }, context={ - 'disabled': 'installed_module', + 'disabled': '_occupied', }, ) module_type = DynamicModelChoiceField( @@ -1233,26 +1233,26 @@ class ModuleBayTemplateForm(ModularComponentTemplateForm): FieldSet('device_type', name=_('Device Type')), FieldSet('module_type', name=_('Module Type')), ), - 'name', 'label', 'position', 'description', + 'name', 'label', 'position', 'enabled', 'description', ), ) class Meta: model = ModuleBayTemplate fields = [ - 'device_type', 'module_type', 'name', 'label', 'position', 'description', + 'device_type', 'module_type', 'name', 'label', 'position', 'enabled', 'description', ] class DeviceBayTemplateForm(ComponentTemplateForm): fieldsets = ( - FieldSet('device_type', 'name', 'label', 'description'), + FieldSet('device_type', 'name', 'label', 'enabled', 'description'), ) class Meta: model = DeviceBayTemplate fields = [ - 'device_type', 'name', 'label', 'description', + 'device_type', 'name', 'label', 'enabled', 'description', ] @@ -1698,25 +1698,25 @@ class RearPortForm(ModularDeviceComponentForm): class ModuleBayForm(ModularDeviceComponentForm): fieldsets = ( - FieldSet('device', 'module', 'name', 'label', 'position', 'description', 'tags',), + FieldSet('device', 'module', 'name', 'label', 'position', 'enabled', 'description', 'tags',), ) class Meta: model = ModuleBay fields = [ - 'device', 'module', 'name', 'label', 'position', 'description', 'owner', 'tags', + 'device', 'module', 'name', 'label', 'position', 'enabled', 'description', 'owner', 'tags', ] class DeviceBayForm(DeviceComponentForm): fieldsets = ( - FieldSet('device', 'name', 'label', 'description', 'tags',), + FieldSet('device', 'name', 'label', 'enabled', 'description', 'tags',), ) class Meta: model = DeviceBay fields = [ - 'device', 'name', 'label', 'description', 'owner', 'tags', + 'device', 'name', 'label', 'enabled', 'description', 'owner', 'tags', ] diff --git a/netbox/dcim/graphql/filters.py b/netbox/dcim/graphql/filters.py index 85a7dfdf5..121110886 100644 --- a/netbox/dcim/graphql/filters.py +++ b/netbox/dcim/graphql/filters.py @@ -318,6 +318,7 @@ class DeviceFilter( @strawberry_django.filter_type(models.DeviceBay, lookups=True) class DeviceBayFilter(ComponentModelFilterMixin, NetBoxModelFilter): + enabled: FilterLookup[bool] | None = strawberry_django.filter_field() installed_device: Annotated['DeviceFilter', strawberry.lazy('dcim.graphql.filters')] | None = ( strawberry_django.filter_field() ) @@ -326,7 +327,7 @@ class DeviceBayFilter(ComponentModelFilterMixin, NetBoxModelFilter): @strawberry_django.filter_type(models.DeviceBayTemplate, lookups=True) class DeviceBayTemplateFilter(ComponentTemplateFilterMixin, ChangeLoggedModelFilter): - pass + enabled: FilterLookup[bool] | None = strawberry_django.filter_field() @strawberry_django.filter_type(models.InventoryItemTemplate, lookups=True) @@ -742,11 +743,13 @@ class ModuleBayFilter(ModularComponentFilterMixin, NetBoxModelFilter): ) parent_id: ID | None = strawberry_django.filter_field() position: StrFilterLookup[str] | None = strawberry_django.filter_field() + enabled: FilterLookup[bool] | None = strawberry_django.filter_field() @strawberry_django.filter_type(models.ModuleBayTemplate, lookups=True) class ModuleBayTemplateFilter(ModularComponentTemplateFilterMixin, ChangeLoggedModelFilter): position: StrFilterLookup[str] | None = strawberry_django.filter_field() + enabled: FilterLookup[bool] | None = strawberry_django.filter_field() @strawberry_django.filter_type(models.ModuleTypeProfile, lookups=True) diff --git a/netbox/dcim/migrations/0229_devicebay_modulebay_enabled.py b/netbox/dcim/migrations/0229_devicebay_modulebay_enabled.py new file mode 100644 index 000000000..16083708a --- /dev/null +++ b/netbox/dcim/migrations/0229_devicebay_modulebay_enabled.py @@ -0,0 +1,30 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ('dcim', '0228_cable_bundle'), + ] + + operations = [ + migrations.AddField( + model_name='devicebay', + name='enabled', + field=models.BooleanField(default=True), + ), + migrations.AddField( + model_name='devicebaytemplate', + name='enabled', + field=models.BooleanField(default=True), + ), + migrations.AddField( + model_name='modulebay', + name='enabled', + field=models.BooleanField(default=True), + ), + migrations.AddField( + model_name='modulebaytemplate', + name='enabled', + field=models.BooleanField(default=True), + ), + ] diff --git a/netbox/dcim/models/device_component_templates.py b/netbox/dcim/models/device_component_templates.py index 0d54331d8..3394ca4ab 100644 --- a/netbox/dcim/models/device_component_templates.py +++ b/netbox/dcim/models/device_component_templates.py @@ -722,6 +722,10 @@ class ModuleBayTemplate(ModularComponentTemplateModel): blank=True, help_text=_('Identifier to reference when renaming installed components') ) + enabled = models.BooleanField( + verbose_name=_('enabled'), + default=True, + ) component_model = ModuleBay @@ -734,6 +738,7 @@ class ModuleBayTemplate(ModularComponentTemplateModel): name=self.resolve_name(kwargs.get('module')), label=self.resolve_label(kwargs.get('module')), position=self.position, + enabled=self.enabled, **kwargs ) instantiate.do_not_call_in_templates = True @@ -743,6 +748,7 @@ class ModuleBayTemplate(ModularComponentTemplateModel): 'name': self.name, 'label': self.label, 'position': self.position, + 'enabled': self.enabled, 'description': self.description, } @@ -751,6 +757,11 @@ class DeviceBayTemplate(ComponentTemplateModel): """ A template for a DeviceBay to be created for a new parent Device. """ + enabled = models.BooleanField( + verbose_name=_('enabled'), + default=True, + ) + component_model = DeviceBay class Meta(ComponentTemplateModel.Meta): @@ -761,7 +772,8 @@ class DeviceBayTemplate(ComponentTemplateModel): return self.component_model( device=device, name=self.name, - label=self.label + label=self.label, + enabled=self.enabled, ) instantiate.do_not_call_in_templates = True @@ -777,6 +789,7 @@ class DeviceBayTemplate(ComponentTemplateModel): return { 'name': self.name, 'label': self.label, + 'enabled': self.enabled, 'description': self.description, } diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index 09dc02ae9..cfed988aa 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -1257,10 +1257,14 @@ class ModuleBay(ModularComponentModel, TrackingModelMixin, MPTTModel): blank=True, help_text=_('Identifier to reference when renaming installed components') ) + enabled = models.BooleanField( + verbose_name=_('enabled'), + default=True, + ) objects = TreeManager() - clone_fields = ('device',) + clone_fields = ('device', 'enabled') class Meta(ModularComponentModel.Meta): # Empty tuple triggers Django migration detection for MPTT indexes @@ -1299,6 +1303,13 @@ class ModuleBay(ModularComponentModel, TrackingModelMixin, MPTTModel): self.parent = None super().save(*args, **kwargs) + @property + def _occupied(self): + """ + Indicates whether the module bay is occupied by a module. + """ + return bool(not self.enabled or hasattr(self, 'installed_module')) + class DeviceBay(ComponentModel, TrackingModelMixin): """ @@ -1311,8 +1322,12 @@ class DeviceBay(ComponentModel, TrackingModelMixin): blank=True, null=True ) + enabled = models.BooleanField( + verbose_name=_('enabled'), + default=True, + ) - clone_fields = ('device',) + clone_fields = ('device', 'enabled') class Meta(ComponentModel.Meta): verbose_name = _('device bay') @@ -1327,6 +1342,16 @@ class DeviceBay(ComponentModel, TrackingModelMixin): device_type=self.device.device_type )) + # Prevent installing a device into a disabled bay + if self.installed_device and not self.enabled: + current_installed_device_id = ( + DeviceBay.objects.filter(pk=self.pk).values_list('installed_device_id', flat=True).first() + ) + if self.pk is None or current_installed_device_id != self.installed_device_id: + raise ValidationError({ + 'installed_device': _("Cannot install a device in a disabled device bay.") + }) + # Cannot install a device into itself, obviously if self.installed_device and getattr(self, 'device', None) == self.installed_device: raise ValidationError(_("Cannot install a device into itself.")) @@ -1341,6 +1366,13 @@ class DeviceBay(ComponentModel, TrackingModelMixin): ).format(bay=current_bay) }) + @property + def _occupied(self): + """ + Indicates whether the device bay is occupied by a child device. + """ + return bool(not self.enabled or self.installed_device_id) + # # Inventory items diff --git a/netbox/dcim/models/modules.py b/netbox/dcim/models/modules.py index 89e914366..1a4645df3 100644 --- a/netbox/dcim/models/modules.py +++ b/netbox/dcim/models/modules.py @@ -258,6 +258,14 @@ class Module(TrackingModelMixin, PrimaryModel, ConfigContextModel): ) ) + # Prevent module from being installed in a disabled bay + if hasattr(self, 'module_bay') and self.module_bay and not self.module_bay.enabled: + current_module_bay_id = Module.objects.filter(pk=self.pk).values_list('module_bay_id', flat=True).first() + if self.pk is None or current_module_bay_id != self.module_bay_id: + raise ValidationError({ + 'module_bay': _("Cannot install a module in a disabled module bay.") + }) + # Check for recursion module = self module_bays = [] diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index 7fbe61e70..e89df45f9 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -888,6 +888,9 @@ class DeviceBayTable(DeviceComponentTable): 'args': [Accessor('device_id')], } ) + enabled = columns.BooleanColumn( + verbose_name=_('Enabled'), + ) status = tables.TemplateColumn( verbose_name=_('Status'), template_code=DEVICEBAY_STATUS, @@ -925,12 +928,12 @@ class DeviceBayTable(DeviceComponentTable): class Meta(DeviceComponentTable.Meta): model = models.DeviceBay fields = ( - 'pk', 'id', 'name', 'device', 'label', 'status', 'description', 'installed_device', 'installed_role', - 'installed_device_type', 'installed_description', 'installed_serial', 'installed_asset_tag', 'tags', - 'created', 'last_updated', + 'pk', 'id', 'name', 'device', 'label', 'enabled', 'status', 'description', 'installed_device', + 'installed_role', 'installed_device_type', 'installed_description', 'installed_serial', + 'installed_asset_tag', 'tags', 'created', 'last_updated', ) - default_columns = ('pk', 'name', 'device', 'label', 'status', 'installed_device', 'description') + default_columns = ('pk', 'name', 'device', 'label', 'enabled', 'status', 'installed_device', 'description') class DeviceDeviceBayTable(DeviceBayTable): @@ -940,6 +943,9 @@ class DeviceDeviceBayTable(DeviceBayTable): '"> {{ value }}', attrs={'td': {'class': 'text-nowrap'}} ) + enabled = columns.BooleanColumn( + verbose_name=_('Enabled'), + ) actions = columns.ActionsColumn( extra_buttons=DEVICEBAY_BUTTONS ) @@ -947,9 +953,9 @@ class DeviceDeviceBayTable(DeviceBayTable): class Meta(DeviceComponentTable.Meta): model = models.DeviceBay fields = ( - 'pk', 'id', 'name', 'label', 'status', 'installed_device', 'description', 'tags', 'actions', + 'pk', 'id', 'name', 'label', 'enabled', 'status', 'installed_device', 'description', 'tags', 'actions', ) - default_columns = ('pk', 'name', 'label', 'status', 'installed_device', 'description') + default_columns = ('pk', 'name', 'label', 'enabled', 'status', 'installed_device', 'description') class ModuleBayTable(ModularDeviceComponentTable): @@ -960,6 +966,9 @@ class ModuleBayTable(ModularDeviceComponentTable): 'args': [Accessor('device_id')], } ) + enabled = columns.BooleanColumn( + verbose_name=_('Enabled'), + ) parent = tables.Column( linkify=True, verbose_name=_('Parent'), @@ -988,11 +997,11 @@ class ModuleBayTable(ModularDeviceComponentTable): class Meta(ModularDeviceComponentTable.Meta): model = models.ModuleBay fields = ( - 'pk', 'id', 'name', 'device', 'parent', 'label', 'position', 'installed_module', 'module_status', + 'pk', 'id', 'name', 'device', 'enabled', 'parent', 'label', 'position', 'installed_module', 'module_status', 'module_serial', 'module_asset_tag', 'description', 'tags', ) default_columns = ( - 'pk', 'name', 'device', 'parent', 'label', 'installed_module', 'module_status', 'description', + 'pk', 'name', 'device', 'enabled', 'parent', 'label', 'installed_module', 'module_status', 'description', ) def render_parent_bay(self, value): @@ -1007,6 +1016,9 @@ class DeviceModuleBayTable(ModuleBayTable): verbose_name=_('Name'), linkify=True, ) + enabled = columns.BooleanColumn( + verbose_name=_('Enabled'), + ) actions = columns.ActionsColumn( extra_buttons=MODULEBAY_BUTTONS ) @@ -1014,10 +1026,10 @@ class DeviceModuleBayTable(ModuleBayTable): class Meta(ModuleBayTable.Meta): model = models.ModuleBay fields = ( - 'pk', 'id', 'parent', 'name', 'label', 'position', 'installed_module', 'module_status', 'module_serial', - 'module_asset_tag', 'description', 'tags', 'actions', + 'pk', 'id', 'parent', 'name', 'label', 'enabled', 'position', 'installed_module', 'module_status', + 'module_serial', 'module_asset_tag', 'description', 'tags', 'actions', ) - default_columns = ('pk', 'name', 'label', 'installed_module', 'module_status', 'description') + default_columns = ('pk', 'name', 'label', 'enabled', 'installed_module', 'module_status', 'description') class InventoryItemTable(DeviceComponentTable): diff --git a/netbox/dcim/tables/devicetypes.py b/netbox/dcim/tables/devicetypes.py index 652ff9d45..f952c2d4a 100644 --- a/netbox/dcim/tables/devicetypes.py +++ b/netbox/dcim/tables/devicetypes.py @@ -289,24 +289,30 @@ class RearPortTemplateTable(ComponentTemplateTable): class ModuleBayTemplateTable(ComponentTemplateTable): + enabled = columns.BooleanColumn( + verbose_name=_('Enabled'), + ) actions = columns.ActionsColumn( actions=('edit', 'delete') ) class Meta(ComponentTemplateTable.Meta): model = models.ModuleBayTemplate - fields = ('pk', 'name', 'label', 'position', 'description', 'actions') + fields = ('pk', 'name', 'label', 'position', 'enabled', 'description', 'actions') empty_text = "None" class DeviceBayTemplateTable(ComponentTemplateTable): + enabled = columns.BooleanColumn( + verbose_name=_('Enabled'), + ) actions = columns.ActionsColumn( actions=('edit', 'delete') ) class Meta(ComponentTemplateTable.Meta): model = models.DeviceBayTemplate - fields = ('pk', 'name', 'label', 'description', 'actions') + fields = ('pk', 'name', 'label', 'enabled', 'description', 'actions') empty_text = "None" diff --git a/netbox/dcim/tables/template_code.py b/netbox/dcim/tables/template_code.py index 3675a18cc..2b786aec5 100644 --- a/netbox/dcim/tables/template_code.py +++ b/netbox/dcim/tables/template_code.py @@ -565,7 +565,7 @@ DEVICEBAY_BUTTONS = """ - {% else %} + {% elif record.enabled %} @@ -579,7 +579,7 @@ MODULEBAY_BUTTONS = """ - {% else %} + {% elif record.enabled %} diff --git a/netbox/dcim/tests/test_api.py b/netbox/dcim/tests/test_api.py index 326678bfa..bbdcc3f36 100644 --- a/netbox/dcim/tests/test_api.py +++ b/netbox/dcim/tests/test_api.py @@ -1226,7 +1226,7 @@ class RearPortTemplateTest(APIViewTestCases.APIViewTestCase): class ModuleBayTemplateTest(APIViewTestCases.APIViewTestCase): model = ModuleBayTemplate - brief_fields = ['description', 'display', 'id', 'name', 'url'] + brief_fields = ['description', 'display', 'enabled', 'id', 'name', 'url'] bulk_update_data = { 'description': 'New description', } @@ -1243,9 +1243,9 @@ class ModuleBayTemplateTest(APIViewTestCases.APIViewTestCase): ) module_bay_templates = ( - ModuleBayTemplate(device_type=devicetype, name='Module Bay Template 1'), - ModuleBayTemplate(device_type=devicetype, name='Module Bay Template 2'), - ModuleBayTemplate(device_type=devicetype, name='Module Bay Template 3'), + ModuleBayTemplate(device_type=devicetype, name='Module Bay Template 1', enabled=True), + ModuleBayTemplate(device_type=devicetype, name='Module Bay Template 2', enabled=False), + ModuleBayTemplate(device_type=devicetype, name='Module Bay Template 3', enabled=True), ) ModuleBayTemplate.objects.bulk_create(module_bay_templates) @@ -1253,6 +1253,7 @@ class ModuleBayTemplateTest(APIViewTestCases.APIViewTestCase): { 'device_type': devicetype.pk, 'name': 'Module Bay Template 4', + 'enabled': False, }, { 'device_type': devicetype.pk, @@ -1267,7 +1268,7 @@ class ModuleBayTemplateTest(APIViewTestCases.APIViewTestCase): class DeviceBayTemplateTest(APIViewTestCases.APIViewTestCase): model = DeviceBayTemplate - brief_fields = ['description', 'display', 'id', 'name', 'url'] + brief_fields = ['description', 'display', 'enabled', 'id', 'name', 'url'] bulk_update_data = { 'description': 'New description', } @@ -1284,9 +1285,9 @@ class DeviceBayTemplateTest(APIViewTestCases.APIViewTestCase): ) device_bay_templates = ( - DeviceBayTemplate(device_type=devicetype, name='Device Bay Template 1'), - DeviceBayTemplate(device_type=devicetype, name='Device Bay Template 2'), - DeviceBayTemplate(device_type=devicetype, name='Device Bay Template 3'), + DeviceBayTemplate(device_type=devicetype, name='Device Bay Template 1', enabled=True), + DeviceBayTemplate(device_type=devicetype, name='Device Bay Template 2', enabled=False), + DeviceBayTemplate(device_type=devicetype, name='Device Bay Template 3', enabled=True), ) DeviceBayTemplate.objects.bulk_create(device_bay_templates) @@ -1294,6 +1295,7 @@ class DeviceBayTemplateTest(APIViewTestCases.APIViewTestCase): { 'device_type': devicetype.pk, 'name': 'Device Bay Template 4', + 'enabled': False, }, { 'device_type': devicetype.pk, @@ -2594,7 +2596,7 @@ class RearPortTest(APIViewTestCases.APIViewTestCase): class ModuleBayTest(APIViewTestCases.APIViewTestCase): model = ModuleBay - brief_fields = ['description', 'display', 'id', 'installed_module', 'name', 'url'] + brief_fields = ['_occupied', 'description', 'display', 'enabled', 'id', 'installed_module', 'name', 'url'] bulk_update_data = { 'description': 'New description', } @@ -2610,9 +2612,9 @@ class ModuleBayTest(APIViewTestCases.APIViewTestCase): device = Device.objects.create(device_type=device_type, role=role, name='Device 1', site=site) module_bays = ( - ModuleBay(device=device, name='Device Bay 1'), - ModuleBay(device=device, name='Device Bay 2'), - ModuleBay(device=device, name='Device Bay 3'), + ModuleBay(device=device, name='Device Bay 1', enabled=True), + ModuleBay(device=device, name='Device Bay 2', enabled=False), + ModuleBay(device=device, name='Device Bay 3', enabled=True), ) for module_bay in module_bays: module_bay.save() @@ -2621,6 +2623,7 @@ class ModuleBayTest(APIViewTestCases.APIViewTestCase): { 'device': device.pk, 'name': 'Device Bay 4', + 'enabled': False, }, { 'device': device.pk, @@ -2635,7 +2638,7 @@ class ModuleBayTest(APIViewTestCases.APIViewTestCase): class DeviceBayTest(APIViewTestCases.APIViewTestCase): model = DeviceBay - brief_fields = ['description', 'device', 'display', 'id', 'name', 'url'] + brief_fields = ['_occupied', 'description', 'device', 'display', 'enabled', 'id', 'name', 'url'] bulk_update_data = { 'description': 'New description', } @@ -2672,9 +2675,9 @@ class DeviceBayTest(APIViewTestCases.APIViewTestCase): Device.objects.bulk_create(devices) device_bays = ( - DeviceBay(device=devices[0], name='Device Bay 1'), - DeviceBay(device=devices[0], name='Device Bay 2'), - DeviceBay(device=devices[0], name='Device Bay 3'), + DeviceBay(device=devices[0], name='Device Bay 1', enabled=True), + DeviceBay(device=devices[0], name='Device Bay 2', enabled=False), + DeviceBay(device=devices[0], name='Device Bay 3', enabled=True), ) DeviceBay.objects.bulk_create(device_bays) diff --git a/netbox/dcim/tests/test_filtersets.py b/netbox/dcim/tests/test_filtersets.py index 8afb4d05f..d91e24d79 100644 --- a/netbox/dcim/tests/test_filtersets.py +++ b/netbox/dcim/tests/test_filtersets.py @@ -2247,13 +2247,21 @@ class ModuleBayTemplateTestCase(TestCase, DeviceComponentTemplateFilterSetTests, ModuleBayTemplate.objects.bulk_create( ( ModuleBayTemplate( - device_type=device_types[0], name='Module Bay 1', description='foobar1' + device_type=device_types[0], name='Module Bay 1', enabled=True, description='foobar1' ), ModuleBayTemplate( - device_type=device_types[1], name='Module Bay 2', description='foobar2', module_type=module_types[0] + device_type=device_types[1], + name='Module Bay 2', + enabled=False, + description='foobar2', + module_type=module_types[0], ), ModuleBayTemplate( - device_type=device_types[2], name='Module Bay 3', description='foobar3', module_type=module_types[1] + device_type=device_types[2], + name='Module Bay 3', + enabled=True, + description='foobar3', + module_type=module_types[1], ), ) ) @@ -2262,6 +2270,12 @@ class ModuleBayTemplateTestCase(TestCase, DeviceComponentTemplateFilterSetTests, params = {'name': ['Module Bay 1', 'Module Bay 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_enabled(self): + params = {'enabled': True} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'enabled': False} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_module_type(self): module_types = ModuleType.objects.all()[:2] params = {'module_type_id': [module_types[0].pk, module_types[1].pk]} @@ -2284,16 +2298,30 @@ class DeviceBayTemplateTestCase(TestCase, DeviceComponentTemplateFilterSetTests, ) DeviceType.objects.bulk_create(device_types) - DeviceBayTemplate.objects.bulk_create(( - DeviceBayTemplate(device_type=device_types[0], name='Device Bay 1', description='foobar1'), - DeviceBayTemplate(device_type=device_types[1], name='Device Bay 2', description='foobar2'), - DeviceBayTemplate(device_type=device_types[2], name='Device Bay 3', description='foobar3'), - )) + DeviceBayTemplate.objects.bulk_create( + ( + DeviceBayTemplate( + device_type=device_types[0], name='Device Bay 1', enabled=True, description='foobar1' + ), + DeviceBayTemplate( + device_type=device_types[1], name='Device Bay 2', enabled=False, description='foobar2' + ), + DeviceBayTemplate( + device_type=device_types[2], name='Device Bay 3', enabled=True, description='foobar3' + ), + ) + ) def test_name(self): params = {'name': ['Device Bay 1', 'Device Bay 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_enabled(self): + params = {'enabled': True} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'enabled': False} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + class InventoryItemTemplateTestCase(TestCase, DeviceComponentTemplateFilterSetTests, ChangeLoggedFilterSetTests): queryset = InventoryItemTemplate.objects.all() @@ -5778,11 +5806,11 @@ class ModuleBayTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFil Device.objects.bulk_create(devices) module_bays = ( - ModuleBay(device=devices[0], name='Module Bay 1', label='A', description='First'), - ModuleBay(device=devices[1], name='Module Bay 2', label='B', description='Second'), - ModuleBay(device=devices[2], name='Module Bay 3', label='C', description='Third'), - ModuleBay(device=devices[2], name='Module Bay 4', label='D', description='Fourth'), - ModuleBay(device=devices[2], name='Module Bay 5', label='E', description='Fifth'), + ModuleBay(device=devices[0], name='Module Bay 1', label='A', enabled=True, description='First'), + ModuleBay(device=devices[1], name='Module Bay 2', label='B', enabled=False, description='Second'), + ModuleBay(device=devices[2], name='Module Bay 3', label='C', enabled=True, description='Third'), + ModuleBay(device=devices[2], name='Module Bay 4', label='D', enabled=False, description='Fourth'), + ModuleBay(device=devices[2], name='Module Bay 5', label='E', enabled=True, description='Fifth'), ) for module_bay in module_bays: module_bay.save() @@ -5806,6 +5834,12 @@ class ModuleBayTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFil params = {'label': ['A', 'B']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_enabled(self): + params = {'enabled': True} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) + params = {'enabled': False} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_description(self): params = {'description': ['First', 'Second']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -5965,6 +5999,7 @@ class DeviceBayTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFil device=devices[0], name='Device Bay 1', label='A', + enabled=True, description='First', _site=devices[0].site, _location=devices[0].location, @@ -5974,6 +6009,7 @@ class DeviceBayTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFil device=devices[1], name='Device Bay 2', label='B', + enabled=False, description='Second', _site=devices[1].site, _location=devices[1].location, @@ -5983,6 +6019,7 @@ class DeviceBayTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFil device=devices[2], name='Device Bay 3', label='C', + enabled=True, description='Third', _site=devices[2].site, _location=devices[2].location, @@ -5999,6 +6036,12 @@ class DeviceBayTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFil params = {'label': ['A', 'B']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_enabled(self): + params = {'enabled': True} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'enabled': False} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_description(self): params = {'description': ['First', 'Second']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) diff --git a/netbox/dcim/tests/test_models.py b/netbox/dcim/tests/test_models.py index c3c3acf99..3509a097d 100644 --- a/netbox/dcim/tests/test_models.py +++ b/netbox/dcim/tests/test_models.py @@ -712,6 +712,112 @@ class DeviceTestCase(TestCase): ).full_clean() +class DeviceBayTestCase(TestCase): + + @classmethod + def setUpTestData(cls): + site = Site.objects.create(name='Test Site 1', slug='test-site-1') + manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1') + + # Parent device type must support device bays (is_parent_device=True) + parent_device_type = DeviceType.objects.create( + manufacturer=manufacturer, + model='Parent Device Type', + slug='parent-device-type', + subdevice_role=SubdeviceRoleChoices.ROLE_PARENT + ) + # Child device type for installation + child_device_type = DeviceType.objects.create( + manufacturer=manufacturer, + model='Child Device Type', + slug='child-device-type', + u_height=0, + subdevice_role=SubdeviceRoleChoices.ROLE_CHILD + ) + device_role = DeviceRole.objects.create(name='Test Role 1', slug='test-role-1') + + cls.parent_device = Device.objects.create( + name='Parent Device', + device_type=parent_device_type, + role=device_role, + site=site + ) + cls.child_device = Device.objects.create( + name='Child Device', + device_type=child_device_type, + role=device_role, + site=site + ) + cls.child_device_2 = Device.objects.create( + name='Child Device 2', + device_type=child_device_type, + role=device_role, + site=site + ) + + def test_cannot_install_device_in_disabled_bay(self): + """ + Test that a device cannot be installed into a disabled DeviceBay. + """ + # Create a disabled device bay with a device being installed + device_bay = DeviceBay( + device=self.parent_device, + name='Disabled Bay', + enabled=False, + installed_device=self.child_device + ) + + with self.assertRaises(ValidationError) as cm: + device_bay.clean() + + self.assertIn('installed_device', cm.exception.message_dict) + self.assertIn('disabled device bay', str(cm.exception.message_dict['installed_device'])) + + def test_can_disable_bay_with_existing_device(self): + """ + Test that disabling a bay that already has a device installed does NOT raise an error + (same installed_device_id). + """ + # First, create an enabled device bay with a device installed + device_bay = DeviceBay.objects.create( + device=self.parent_device, + name='Bay To Disable', + enabled=True, + installed_device=self.child_device + ) + + # Now disable the bay while keeping the same installed device + device_bay.enabled = False + # This should NOT raise a ValidationError + device_bay.clean() + device_bay.save() + + device_bay.refresh_from_db() + self.assertFalse(device_bay.enabled) + self.assertEqual(device_bay.installed_device, self.child_device) + + def test_cannot_change_installed_device_in_disabled_bay(self): + """ + Test that changing the installed device in a disabled bay raises a ValidationError. + """ + # Create an enabled device bay with a device installed + device_bay = DeviceBay.objects.create( + device=self.parent_device, + name='Bay With Device', + enabled=True, + installed_device=self.child_device + ) + + # Disable the bay and try to change the installed device + device_bay.enabled = False + device_bay.installed_device = self.child_device_2 + + with self.assertRaises(ValidationError) as cm: + device_bay.clean() + + self.assertIn('installed_device', cm.exception.message_dict) + + class ModuleBayTestCase(TestCase): @classmethod @@ -1011,6 +1117,25 @@ class ModuleBayTestCase(TestCase): self.assertEqual(RearPort.objects.filter(module=module).count(), 1) self.assertEqual(PortMapping.objects.filter(front_port__module=module).count(), 0) + def test_cannot_install_module_in_disabled_bay(self): + """ + Test that a Module cannot be installed into a disabled ModuleBay. + """ + device = Device.objects.first() + manufacturer = Manufacturer.objects.first() + module_type = ModuleType.objects.create(manufacturer=manufacturer, model='Test Module Type Disabled') + + # Create a disabled module bay + disabled_bay = ModuleBay.objects.create(device=device, name='Disabled Bay', enabled=False) + + # Attempt to install a module into the disabled bay + module = Module(device=device, module_bay=disabled_bay, module_type=module_type) + with self.assertRaises(ValidationError) as cm: + module.clean() + + self.assertIn('module_bay', cm.exception.message_dict) + self.assertIn('disabled module bay', str(cm.exception.message_dict['module_bay'])) + class CableTestCase(TestCase): From b01d92c98b192485970695cd7ae344ce4c22fec2 Mon Sep 17 00:00:00 2001 From: bctiemann Date: Fri, 13 Mar 2026 03:19:45 -0400 Subject: [PATCH 020/104] Fixes: #19953 - ConfigTemplate debug rendering mode (#21652) Add debug field to ConfigTemplate and (if True) render template errors with a full traceback. --- netbox/extras/api/mixins.py | 12 ++--- .../api/serializers_/configtemplates.py | 4 +- netbox/extras/filtersets.py | 2 +- netbox/extras/forms/bulk_edit.py | 5 ++ netbox/extras/forms/bulk_import.py | 3 +- netbox/extras/forms/filtersets.py | 9 +++- netbox/extras/forms/model_forms.py | 3 +- .../migrations/0135_configtemplate_debug.py | 22 +++++++++ netbox/extras/models/configs.py | 27 +++++++++++ netbox/extras/models/mixins.py | 3 +- netbox/extras/tables/tables.py | 6 ++- netbox/extras/tests/test_models.py | 48 +++++++++++++++++++ netbox/extras/views.py | 8 ++-- netbox/templates/extras/configtemplate.html | 4 ++ .../extras/object_render_config.html | 8 +++- netbox/utilities/jinja2.py | 12 ++++- 16 files changed, 155 insertions(+), 21 deletions(-) create mode 100644 netbox/extras/migrations/0135_configtemplate_debug.py diff --git a/netbox/extras/api/mixins.py b/netbox/extras/api/mixins.py index a98218b78..795d50af8 100644 --- a/netbox/extras/api/mixins.py +++ b/netbox/extras/api/mixins.py @@ -1,8 +1,7 @@ -from jinja2.exceptions import TemplateError from rest_framework.decorators import action from rest_framework.renderers import JSONRenderer from rest_framework.response import Response -from rest_framework.status import HTTP_400_BAD_REQUEST +from rest_framework.status import HTTP_400_BAD_REQUEST, HTTP_500_INTERNAL_SERVER_ERROR from netbox.api.authentication import TokenWritePermission from netbox.api.renderers import TextRenderer @@ -45,10 +44,11 @@ class ConfigTemplateRenderMixin: def render_configtemplate(self, request, configtemplate, context): try: output = configtemplate.render(context=context) - except TemplateError as e: - return Response({ - 'detail': f"An error occurred while rendering the template (line {e.lineno}): {e}" - }, status=500) + except Exception as e: + detail = configtemplate.format_render_error(e) + if request.accepted_renderer.format == 'txt': + return Response(detail, status=HTTP_500_INTERNAL_SERVER_ERROR) + return Response({'detail': detail}, status=HTTP_500_INTERNAL_SERVER_ERROR) # If the client has requested "text/plain", return the raw content. if request.accepted_renderer.format == 'txt': diff --git a/netbox/extras/api/serializers_/configtemplates.py b/netbox/extras/api/serializers_/configtemplates.py index ac9f40738..4bf4608ac 100644 --- a/netbox/extras/api/serializers_/configtemplates.py +++ b/netbox/extras/api/serializers_/configtemplates.py @@ -28,7 +28,7 @@ class ConfigTemplateSerializer( model = ConfigTemplate fields = [ 'id', 'url', 'display_url', 'display', 'name', 'description', 'environment_params', 'template_code', - 'mime_type', 'file_name', 'file_extension', 'as_attachment', 'data_source', 'data_path', 'data_file', - 'auto_sync_enabled', 'data_synced', 'owner', 'tags', 'created', 'last_updated', + 'mime_type', 'file_name', 'file_extension', 'as_attachment', 'debug', 'data_source', 'data_path', + 'data_file', 'auto_sync_enabled', 'data_synced', 'owner', 'tags', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') diff --git a/netbox/extras/filtersets.py b/netbox/extras/filtersets.py index 2b995e52a..444b87da1 100644 --- a/netbox/extras/filtersets.py +++ b/netbox/extras/filtersets.py @@ -857,7 +857,7 @@ class ConfigTemplateFilterSet(OwnerFilterMixin, ChangeLoggedModelFilterSet): class Meta: model = ConfigTemplate fields = ( - 'id', 'name', 'description', 'mime_type', 'file_name', 'file_extension', 'as_attachment', + 'id', 'name', 'description', 'mime_type', 'file_name', 'file_extension', 'as_attachment', 'debug', 'auto_sync_enabled', 'data_synced' ) diff --git a/netbox/extras/forms/bulk_edit.py b/netbox/extras/forms/bulk_edit.py index 6805898fc..de0f2bb27 100644 --- a/netbox/extras/forms/bulk_edit.py +++ b/netbox/extras/forms/bulk_edit.py @@ -392,6 +392,11 @@ class ConfigTemplateBulkEditForm(ChangelogMessageMixin, OwnerMixin, BulkEditForm required=False, widget=BulkEditNullBooleanSelect() ) + debug = forms.NullBooleanField( + label=_('Debug'), + required=False, + widget=BulkEditNullBooleanSelect() + ) auto_sync_enabled = forms.NullBooleanField( label=_('Auto sync enabled'), required=False, diff --git a/netbox/extras/forms/bulk_import.py b/netbox/extras/forms/bulk_import.py index 91d5b2751..df329fbcb 100644 --- a/netbox/extras/forms/bulk_import.py +++ b/netbox/extras/forms/bulk_import.py @@ -190,7 +190,8 @@ class ConfigTemplateImportForm(OwnerCSVMixin, CSVModelForm): model = ConfigTemplate fields = ( 'name', 'description', 'template_code', 'data_source', 'data_file', 'auto_sync_enabled', - 'environment_params', 'mime_type', 'file_name', 'file_extension', 'as_attachment', 'owner', 'tags', + 'environment_params', 'mime_type', 'file_name', 'file_extension', 'as_attachment', 'debug', 'owner', + 'tags', ) def clean(self): diff --git a/netbox/extras/forms/filtersets.py b/netbox/extras/forms/filtersets.py index 3fd551929..cbff6947e 100644 --- a/netbox/extras/forms/filtersets.py +++ b/netbox/extras/forms/filtersets.py @@ -497,7 +497,7 @@ class ConfigTemplateFilterForm(OwnerFilterMixin, SavedFiltersMixin, FilterForm): fieldsets = ( FieldSet('q', 'filter_id', 'tag'), FieldSet('data_source_id', 'data_file_id', 'auto_sync_enabled', name=_('Data')), - FieldSet('mime_type', 'file_name', 'file_extension', 'as_attachment', name=_('Rendering')), + FieldSet('mime_type', 'file_name', 'file_extension', 'as_attachment', 'debug', name=_('Rendering')), FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), ) data_source_id = DynamicModelMultipleChoiceField( @@ -540,6 +540,13 @@ class ConfigTemplateFilterForm(OwnerFilterMixin, SavedFiltersMixin, FilterForm): choices=BOOLEAN_WITH_BLANK_CHOICES ) ) + debug = forms.NullBooleanField( + label=_('Debug'), + required=False, + widget=forms.Select( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) class LocalConfigContextFilterForm(forms.Form): diff --git a/netbox/extras/forms/model_forms.py b/netbox/extras/forms/model_forms.py index 6a5e8f209..d01e32691 100644 --- a/netbox/extras/forms/model_forms.py +++ b/netbox/extras/forms/model_forms.py @@ -754,7 +754,8 @@ class ConfigTemplateForm(ChangelogMessageMixin, SyncedDataMixin, OwnerMixin, for FieldSet('name', 'description', 'tags', 'template_code', name=_('Config Template')), FieldSet('data_source', 'data_file', 'auto_sync_enabled', name=_('Data Source')), FieldSet( - 'mime_type', 'file_name', 'file_extension', 'environment_params', 'as_attachment', name=_('Rendering') + 'mime_type', 'file_name', 'file_extension', 'environment_params', 'as_attachment', 'debug', + name=_('Rendering') ), ) diff --git a/netbox/extras/migrations/0135_configtemplate_debug.py b/netbox/extras/migrations/0135_configtemplate_debug.py new file mode 100644 index 000000000..cddfaf240 --- /dev/null +++ b/netbox/extras/migrations/0135_configtemplate_debug.py @@ -0,0 +1,22 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ('extras', '0134_owner'), + ] + + operations = [ + migrations.AddField( + model_name='configtemplate', + name='debug', + field=models.BooleanField( + default=False, + help_text=( + 'Enable verbose error output when rendering this template. ' + 'Not recommended for production use.' + ), + verbose_name='debug', + ), + ), + ] diff --git a/netbox/extras/models/configs.py b/netbox/extras/models/configs.py index 1aaeec1ab..477fa2e03 100644 --- a/netbox/extras/models/configs.py +++ b/netbox/extras/models/configs.py @@ -1,9 +1,12 @@ +import traceback + import jsonschema from django.conf import settings from django.core.validators import ValidationError from django.db import models from django.urls import reverse from django.utils.translation import gettext_lazy as _ +from jinja2.exceptions import TemplateError from jsonschema.exceptions import ValidationError as JSONValidationError from extras.models.mixins import RenderTemplateMixin @@ -281,6 +284,13 @@ class ConfigTemplate( max_length=200, blank=True ) + debug = models.BooleanField( + verbose_name=_('debug'), + default=False, + help_text=_( + 'Enable verbose error output when rendering this template. Not recommended for production use.' + ) + ) class Meta: ordering = ('name',) @@ -299,3 +309,20 @@ class ConfigTemplate( """ self.template_code = self.data_file.data_as_string sync_data.alters_data = True + + def format_render_error(self, exc): + """ + Return a formatted error string for a rendering exception. When debug is enabled, the full + traceback for the provided exception is returned. Otherwise, a concise, user-facing message + is returned. + """ + if self.debug: + return ''.join(traceback.format_exception(exc)) + if isinstance(exc, TemplateError): + parts = [f"{type(exc).__name__}: {exc}"] + if getattr(exc, 'name', None): + parts.append(_("Template: {name}").format(name=exc.name)) + if getattr(exc, 'lineno', None): + parts.append(_("Line: {lineno}").format(lineno=exc.lineno)) + return "\n".join(parts) + return f"{type(exc).__name__}: {exc}" diff --git a/netbox/extras/models/mixins.py b/netbox/extras/models/mixins.py index 704f96133..805916d9f 100644 --- a/netbox/extras/models/mixins.py +++ b/netbox/extras/models/mixins.py @@ -150,7 +150,8 @@ class RenderTemplateMixin(models.Model): """ context = self.get_context(context=context, queryset=queryset) env_params = self.get_environment_params() - output = render_jinja2(self.template_code, context, env_params, getattr(self, 'data_file', None)) + debug = getattr(self, 'debug', False) + output = render_jinja2(self.template_code, context, env_params, getattr(self, 'data_file', None), debug=debug) # Replace CRLF-style line terminators output = output.replace('\r\n', '\n') diff --git a/netbox/extras/tables/tables.py b/netbox/extras/tables/tables.py index a4026fe39..3315e1252 100644 --- a/netbox/extras/tables/tables.py +++ b/netbox/extras/tables/tables.py @@ -697,6 +697,10 @@ class ConfigTemplateTable(NetBoxTable): verbose_name=_('As Attachment'), false_mark=None ) + debug = columns.BooleanColumn( + verbose_name=_('Debug'), + false_mark=None + ) owner = tables.Column( linkify=True, verbose_name=_('Owner') @@ -728,7 +732,7 @@ class ConfigTemplateTable(NetBoxTable): class Meta(NetBoxTable.Meta): model = ConfigTemplate fields = ( - 'pk', 'id', 'name', 'description', 'data_source', 'data_file', 'data_synced', 'as_attachment', + 'pk', 'id', 'name', 'description', 'data_source', 'data_file', 'data_synced', 'as_attachment', 'debug', 'mime_type', 'file_name', 'file_extension', 'role_count', 'platform_count', 'device_count', 'vm_count', 'created', 'last_updated', 'tags', ) diff --git a/netbox/extras/tests/test_models.py b/netbox/extras/tests/test_models.py index 46cf4fe7d..2494b266b 100644 --- a/netbox/extras/tests/test_models.py +++ b/netbox/extras/tests/test_models.py @@ -818,6 +818,54 @@ class ConfigTemplateTest(TestCase): self.assertEqual(autosync_records.count(), 0, "AutoSyncRecord should be deleted after detaching") +class ConfigTemplateDebugTest(TestCase): + """ + Tests for the ConfigTemplate debug field and its effect on template rendering error output. + """ + + def _make_template(self, template_code, debug=False): + t = ConfigTemplate( + name=f"DebugTestTemplate-{debug}", + template_code=template_code, + debug=debug, + ) + t.save() + return t + + def test_debug_default_is_false(self): + t = ConfigTemplate(name="t", template_code="hello") + self.assertFalse(t.debug) + + def test_template_error_non_debug_no_traceback(self): + """In non-debug mode, a TemplateError raises with no traceback exposure.""" + from jinja2 import TemplateError + t = self._make_template("{{ unclosed", debug=False) + with self.assertRaises(TemplateError): + t.render({}) + + def test_template_error_debug_mode_raises(self): + """In debug mode, a TemplateError still raises (callers handle display).""" + from jinja2 import TemplateError + t = self._make_template("{{ unclosed", debug=True) + with self.assertRaises(TemplateError): + t.render({}) + + def test_render_jinja2_debug_extension_enabled(self): + """When debug=True, the Jinja2 debug extension is loaded in the environment.""" + from utilities.jinja2 import render_jinja2 + # The {% debug %} tag is only available when the debug extension is loaded. + output = render_jinja2("{% debug %}", {}, debug=True) + self.assertIsInstance(output, str) + + def test_render_jinja2_debug_extension_not_loaded_by_default(self): + """When debug=False, the {% debug %} tag is not available.""" + from jinja2 import TemplateSyntaxError + + from utilities.jinja2 import render_jinja2 + with self.assertRaises(TemplateSyntaxError): + render_jinja2("{% debug %}", {}, debug=False) + + class ExportTemplateContextTest(TestCase): """ Tests for ExportTemplate.get_context() including public model population. diff --git a/netbox/extras/views.py b/netbox/extras/views.py index 05a3dbb13..567a0a5fe 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -12,7 +12,6 @@ from django.utils import timezone from django.utils.module_loading import import_string from django.utils.translation import gettext as _ from django.views.generic import View -from jinja2.exceptions import TemplateError from core.choices import ManagedFileRootPathChoices from core.models import Job @@ -1120,11 +1119,12 @@ class ObjectRenderConfigView(generic.ObjectView): # Render the config template rendered_config = None error_message = '' - if config_template := instance.get_config_template(): + config_template = instance.get_config_template() + if config_template: try: rendered_config = config_template.render(context=context_data) - except TemplateError as e: - error_message = _("An error occurred while rendering the template: {error}").format(error=e) + except Exception as e: + error_message = config_template.format_render_error(e) return { 'base_template': self.base_template, diff --git a/netbox/templates/extras/configtemplate.html b/netbox/templates/extras/configtemplate.html index a2e31baed..623263a15 100644 --- a/netbox/templates/extras/configtemplate.html +++ b/netbox/templates/extras/configtemplate.html @@ -33,6 +33,10 @@ {% trans "Attachment" %} {% checkmark object.as_attachment %} + + {% trans "Debug" %} + {% checkmark object.debug %} + {% trans "Data Source" %} diff --git a/netbox/templates/extras/object_render_config.html b/netbox/templates/extras/object_render_config.html index aec25cd64..89c133980 100644 --- a/netbox/templates/extras/object_render_config.html +++ b/netbox/templates/extras/object_render_config.html @@ -66,7 +66,13 @@ {% elif error_message %}

{% trans "Error rendering template" %}

- {% trans error_message %} + {% if config_template.debug %} +
+
{{ error_message }}
+
+ {% else %} +
{{ error_message }}
+ {% endif %}
{% else %}
diff --git a/netbox/utilities/jinja2.py b/netbox/utilities/jinja2.py index 362bc2393..3926ebbf1 100644 --- a/netbox/utilities/jinja2.py +++ b/netbox/utilities/jinja2.py @@ -49,11 +49,19 @@ class DataFileLoader(BaseLoader): # Utility functions # -def render_jinja2(template_code, context, environment_params=None, data_file=None): +def render_jinja2(template_code, context, environment_params=None, data_file=None, debug=False): """ Render a Jinja2 template with the provided context. Return the rendered content. + + If debug is True, the Jinja2 debug extension is enabled to assist with template development. """ - environment_params = environment_params or {} + environment_params = dict(environment_params or {}) + + if debug: + extensions = list(environment_params.get('extensions', [])) + if 'jinja2.ext.debug' not in extensions: + extensions.append('jinja2.ext.debug') + environment_params['extensions'] = extensions if 'loader' not in environment_params: if data_file: From 639a739b5b26f9525f9b2dd728eb1ff42091b23e Mon Sep 17 00:00:00 2001 From: Martin Hauser Date: Fri, 13 Mar 2026 15:10:18 +0100 Subject: [PATCH 021/104] feat(ipam): Add bulk creation support for prefixes Implement bulk prefix creation using network patterns (e.g., 10.[0-2].0/2). Refactor bulk creation views to support reusable context and templates. Rename IPAddressBulkCreateForm to IPNetworkBulkCreateForm for IPv4/IPv6 support. --- netbox/ipam/forms/bulk_create.py | 13 ++-- netbox/ipam/forms/model_forms.py | 32 +++++++++ netbox/ipam/tests/test_views.py | 68 +++++++++++++++++++ netbox/ipam/views.py | 12 +++- netbox/netbox/views/generic/bulk_views.py | 28 ++++---- netbox/templates/generic/bulk_add.html | 49 +++++++++++++ .../ipam/inc/prefix_edit_header.html | 17 +++++ netbox/templates/ipam/ipaddress_bulk_add.html | 37 +--------- netbox/templates/ipam/prefix_bulk_add.html | 5 ++ netbox/templates/ipam/prefix_edit.html | 5 ++ netbox/utilities/forms/constants.py | 2 +- netbox/utilities/forms/fields/expandable.py | 41 +++++++---- netbox/utilities/forms/utils.py | 8 +-- netbox/utilities/tests/test_forms.py | 48 ++++++------- 14 files changed, 268 insertions(+), 97 deletions(-) create mode 100644 netbox/templates/generic/bulk_add.html create mode 100644 netbox/templates/ipam/inc/prefix_edit_header.html create mode 100644 netbox/templates/ipam/prefix_bulk_add.html create mode 100644 netbox/templates/ipam/prefix_edit.html diff --git a/netbox/ipam/forms/bulk_create.py b/netbox/ipam/forms/bulk_create.py index 856476786..763dbac9c 100644 --- a/netbox/ipam/forms/bulk_create.py +++ b/netbox/ipam/forms/bulk_create.py @@ -1,14 +1,17 @@ from django import forms from django.utils.translation import gettext_lazy as _ -from utilities.forms.fields import ExpandableIPAddressField +from utilities.forms.fields import ExpandableIPNetworkField __all__ = ( - 'IPAddressBulkCreateForm', + 'IPNetworkBulkCreateForm', ) -class IPAddressBulkCreateForm(forms.Form): - pattern = ExpandableIPAddressField( - label=_('Address pattern') +class IPNetworkBulkCreateForm(forms.Form): + """ + Pattern form for bulk-creating IP-based objects (addresses, prefixes). + """ + pattern = ExpandableIPNetworkField( + label=_('Pattern') ) diff --git a/netbox/ipam/forms/model_forms.py b/netbox/ipam/forms/model_forms.py index 3748f2901..d3159320d 100644 --- a/netbox/ipam/forms/model_forms.py +++ b/netbox/ipam/forms/model_forms.py @@ -37,6 +37,7 @@ __all__ = ( 'IPAddressBulkAddForm', 'IPAddressForm', 'IPRangeForm', + 'PrefixBulkAddForm', 'PrefixForm', 'RIRForm', 'RoleForm', @@ -249,6 +250,32 @@ class PrefixForm(TenancyForm, ScopedForm, PrimaryModelForm): self.fields['vlan'].widget.attrs.pop('data-dynamic-params', None) +class PrefixBulkAddForm(TenancyForm, NetBoxModelForm): + vrf = DynamicModelChoiceField( + queryset=VRF.objects.all(), + required=False, + label=_('VRF') + ) + role = DynamicModelChoiceField( + label=_('Role'), + queryset=Role.objects.all(), + required=False, + quick_add=True + ) + + fieldsets = ( + FieldSet('status', 'role', 'vrf', 'is_pool', 'mark_utilized', 'description', 'tags', name=_('Prefix')), + FieldSet('tenant_group', 'tenant', name=_('Tenancy')), + ) + + class Meta: + model = Prefix + fields = [ + 'prefix', 'vrf', 'status', 'role', 'is_pool', 'mark_utilized', 'description', 'tenant_group', 'tenant', + 'tags', + ] + + class IPRangeForm(TenancyForm, PrimaryModelForm): vrf = DynamicModelChoiceField( queryset=VRF.objects.all(), @@ -472,6 +499,11 @@ class IPAddressBulkAddForm(TenancyForm, NetBoxModelForm): label=_('VRF') ) + fieldsets = ( + FieldSet('status', 'role', 'vrf', 'dns_name', 'description', 'tags', name=_('IP Address')), + FieldSet('tenant_group', 'tenant', name=_('Tenancy')), + ) + class Meta: model = IPAddress fields = [ diff --git a/netbox/ipam/tests/test_views.py b/netbox/ipam/tests/test_views.py index 5154397bb..04a88ace4 100644 --- a/netbox/ipam/tests/test_views.py +++ b/netbox/ipam/tests/test_views.py @@ -467,6 +467,74 @@ class PrefixTestCase(ViewTestCases.PrimaryObjectViewTestCase): 'description': 'New description', } + @override_settings(EXEMPT_VIEW_PERMISSIONS=['*']) + def test_bulk_add_ipv4_prefixes(self): + """Test bulk creating IPv4 prefixes using a pattern.""" + obj_perm = ObjectPermission(name='Test permission', actions=['add']) + obj_perm.save() + obj_perm.users.add(self.user) + obj_perm.object_types.add(ObjectType.objects.get_for_model(Prefix)) + + initial_count = Prefix.objects.count() + url = reverse('ipam:prefix_bulk_add') + data = { + 'pattern': '10.0.[0-2].0/24', + 'status': PrefixStatusChoices.STATUS_ACTIVE, + } + response = self.client.post(url, data) + self.assertHttpStatus(response, 302) + self.assertEqual(Prefix.objects.count(), initial_count + 3) + + for i in range(3): + self.assertTrue(Prefix.objects.filter(prefix=IPNetwork(f'10.0.{i}.0/24')).exists()) + + @override_settings(EXEMPT_VIEW_PERMISSIONS=['*']) + def test_bulk_add_ipv6_prefixes(self): + """Test bulk creating IPv6 prefixes using a pattern.""" + obj_perm = ObjectPermission(name='Test permission', actions=['add']) + obj_perm.save() + obj_perm.users.add(self.user) + obj_perm.object_types.add(ObjectType.objects.get_for_model(Prefix)) + + initial_count = Prefix.objects.count() + url = reverse('ipam:prefix_bulk_add') + data = { + 'pattern': 'fd00:db8:[0-3]::/48', + 'status': PrefixStatusChoices.STATUS_ACTIVE, + } + response = self.client.post(url, data) + self.assertHttpStatus(response, 302) + self.assertEqual(Prefix.objects.count(), initial_count + 4) + + for i in range(4): + self.assertTrue(Prefix.objects.filter(prefix=IPNetwork(f'fd00:db8:{i}::/48')).exists()) + + @override_settings(EXEMPT_VIEW_PERMISSIONS=['*']) + def test_bulk_add_ipv6_prefixes_uppercase_hex(self): + """Test bulk creating IPv6 prefixes using uppercase hex in the pattern.""" + obj_perm = ObjectPermission(name='Test permission', actions=['add']) + obj_perm.save() + obj_perm.users.add(self.user) + obj_perm.object_types.add(ObjectType.objects.get_for_model(Prefix)) + + initial_count = Prefix.objects.count() + url = reverse('ipam:prefix_bulk_add') + data = { + 'pattern': 'fd00:0:0:[48-4F]00::/56', + 'status': PrefixStatusChoices.STATUS_ACTIVE, + } + response = self.client.post(url, data) + self.assertHttpStatus(response, 302) + self.assertEqual(Prefix.objects.count(), initial_count + 8) + + expected_hex = ['48', '49', '4a', '4b', '4c', '4d', '4e', '4f'] + for h in expected_hex: + prefix_str = f'fd00:0:0:{h}00::/56' + self.assertTrue( + Prefix.objects.filter(prefix=IPNetwork(prefix_str)).exists(), + f'Expected prefix {prefix_str} was not created' + ) + @override_settings(EXEMPT_VIEW_PERMISSIONS=['*']) def test_prefix_prefixes(self): prefixes = ( diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 6ceb0c53a..77e1daa8c 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -714,6 +714,7 @@ class PrefixIPAddressesView(generic.ObjectChildrenView): class PrefixEditView(generic.ObjectEditView): queryset = Prefix.objects.all() form = forms.PrefixForm + template_name = 'ipam/prefix_edit.html' @register_model_view(Prefix, 'delete') @@ -721,6 +722,15 @@ class PrefixDeleteView(generic.ObjectDeleteView): queryset = Prefix.objects.all() +@register_model_view(Prefix, 'bulk_add', path='bulk-add', detail=False) +class PrefixBulkCreateView(generic.BulkCreateView): + queryset = Prefix.objects.all() + form = forms.IPNetworkBulkCreateForm + model_form = forms.PrefixBulkAddForm + pattern_target = 'prefix' + template_name = 'ipam/prefix_bulk_add.html' + + @register_model_view(Prefix, 'bulk_import', path='import', detail=False) class PrefixBulkImportView(generic.BulkImportView): queryset = Prefix.objects.all() @@ -979,7 +989,7 @@ class IPAddressDeleteView(generic.ObjectDeleteView): @register_model_view(IPAddress, 'bulk_add', path='bulk-add', detail=False) class IPAddressBulkCreateView(generic.BulkCreateView): queryset = IPAddress.objects.all() - form = forms.IPAddressBulkCreateForm + form = forms.IPNetworkBulkCreateForm model_form = forms.IPAddressBulkAddForm pattern_target = 'address' template_name = 'ipam/ipaddress_bulk_add.html' diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py index 2522a079a..ec18412a4 100644 --- a/netbox/netbox/views/generic/bulk_views.py +++ b/netbox/netbox/views/generic/bulk_views.py @@ -254,6 +254,18 @@ class BulkCreateView(GetReturnURLMixin, BaseMultiObjectView): return new_objects + def _get_context(self, request, form, model_form): + model = self.queryset.model + return { + 'obj_type': model._meta.verbose_name, + 'obj_type_plural': model._meta.verbose_name_plural, + 'form': form, + 'model_form': model_form, + 'return_url': self.get_return_url(request), + 'add_url': get_action_url(model, 'add'), + **self.get_extra_context(request), + } + # # Request handlers # @@ -268,13 +280,7 @@ class BulkCreateView(GetReturnURLMixin, BaseMultiObjectView): form = self.form() model_form = self.model_form(initial=initial) - return render(request, self.template_name, { - 'obj_type': self.model_form._meta.model._meta.verbose_name, - 'form': form, - 'model_form': model_form, - 'return_url': self.get_return_url(request), - **self.get_extra_context(request), - }) + return render(request, self.template_name, self._get_context(request, form, model_form)) def post(self, request): logger = logging.getLogger('netbox.views.BulkCreateView') @@ -313,13 +319,7 @@ class BulkCreateView(GetReturnURLMixin, BaseMultiObjectView): else: logger.debug("Form validation failed") - return render(request, self.template_name, { - 'form': form, - 'model_form': model_form, - 'obj_type': model._meta.verbose_name, - 'return_url': self.get_return_url(request), - **self.get_extra_context(request), - }) + return render(request, self.template_name, self._get_context(request, form, model_form)) class BulkImportView(GetReturnURLMixin, BaseMultiObjectView): diff --git a/netbox/templates/generic/bulk_add.html b/netbox/templates/generic/bulk_add.html new file mode 100644 index 000000000..ebc7bc0be --- /dev/null +++ b/netbox/templates/generic/bulk_add.html @@ -0,0 +1,49 @@ +{% extends 'generic/object_edit.html' %} +{% load helpers %} +{% load form_helpers %} +{% load i18n %} + +{% block title %}{% blocktrans trimmed with object_type_plural=obj_type_plural %}Bulk Add {{ object_type_plural }}{% endblocktrans %}{% endblock %} + +{% block tabs %} + +{% endblock %} + +{% block form %} +
+
+

{% trans "Pattern" %}

+
+ {% render_field form.pattern %} +
+ + {% if model_form.fieldsets %} + {% for fieldset in model_form.fieldsets %} + {% render_fieldset model_form fieldset %} + {% endfor %} + {% else %} +
+ {% render_form model_form %} +
+ {% endif %} + + {% if model_form.custom_fields %} +
+
+

{% trans "Custom Fields" %}

+
+ {% render_custom_fields model_form %} +
+ {% endif %} +{% endblock %} diff --git a/netbox/templates/ipam/inc/prefix_edit_header.html b/netbox/templates/ipam/inc/prefix_edit_header.html new file mode 100644 index 000000000..db8c12d46 --- /dev/null +++ b/netbox/templates/ipam/inc/prefix_edit_header.html @@ -0,0 +1,17 @@ +{% load helpers %} +{% load i18n %} + + diff --git a/netbox/templates/ipam/ipaddress_bulk_add.html b/netbox/templates/ipam/ipaddress_bulk_add.html index a5b3599fc..91384097f 100644 --- a/netbox/templates/ipam/ipaddress_bulk_add.html +++ b/netbox/templates/ipam/ipaddress_bulk_add.html @@ -1,40 +1,5 @@ -{% extends 'generic/object_edit.html' %} -{% load static %} -{% load form_helpers %} -{% load i18n %} - -{% block title %}{% trans "Bulk Add IP Addresses" %}{% endblock %} +{% extends 'generic/bulk_add.html' %} {% block tabs %} {% include 'ipam/inc/ipaddress_edit_header.html' with active_tab='bulk_add' %} {% endblock %} - -{% block form %} -
-
-

{% trans "IP Addresses" %}

-
- {% render_field form.pattern %} - {% render_field model_form.status %} - {% render_field model_form.role %} - {% render_field model_form.vrf %} - {% render_field model_form.description %} - {% render_field model_form.tags %} -
- -
-
-

{% trans "Tenancy" %}

-
- {% render_field model_form.tenant_group %} - {% render_field model_form.tenant %} -
- {% if model_form.custom_fields %} -
-
-

{% trans "Custom Fields" %}

-
- {% render_custom_fields model_form %} -
- {% endif %} -{% endblock %} diff --git a/netbox/templates/ipam/prefix_bulk_add.html b/netbox/templates/ipam/prefix_bulk_add.html new file mode 100644 index 000000000..3dfa2a811 --- /dev/null +++ b/netbox/templates/ipam/prefix_bulk_add.html @@ -0,0 +1,5 @@ +{% extends 'generic/bulk_add.html' %} + +{% block tabs %} + {% include 'ipam/inc/prefix_edit_header.html' with active_tab='bulk_add' %} +{% endblock %} diff --git a/netbox/templates/ipam/prefix_edit.html b/netbox/templates/ipam/prefix_edit.html new file mode 100644 index 000000000..3c8d33486 --- /dev/null +++ b/netbox/templates/ipam/prefix_edit.html @@ -0,0 +1,5 @@ +{% extends 'generic/object_edit.html' %} + +{% block tabs %} + {% include 'ipam/inc/prefix_edit_header.html' with active_tab='add' %} +{% endblock %} diff --git a/netbox/utilities/forms/constants.py b/netbox/utilities/forms/constants.py index 624ad5dac..19b3bd464 100644 --- a/netbox/utilities/forms/constants.py +++ b/netbox/utilities/forms/constants.py @@ -4,7 +4,7 @@ ALPHANUMERIC_EXPANSION_PATTERN = r'\[((?:[a-zA-Z0-9]+[?:,-])+[a-zA-Z0-9]+)\]' # IP address expansion patterns IP4_EXPANSION_PATTERN = r'\[((?:[0-9]{1,3}[?:,-])+[0-9]{1,3})\]' -IP6_EXPANSION_PATTERN = r'\[((?:[0-9a-f]{1,4}[?:,-])+[0-9a-f]{1,4})\]' +IP6_EXPANSION_PATTERN = r'\[((?:[0-9a-fA-F]{1,4}[?:,-])+[0-9a-fA-F]{1,4})\]' # Boolean widget choices BOOLEAN_WITH_BLANK_CHOICES = ( diff --git a/netbox/utilities/forms/fields/expandable.py b/netbox/utilities/forms/fields/expandable.py index a279985ee..157d825a5 100644 --- a/netbox/utilities/forms/fields/expandable.py +++ b/netbox/utilities/forms/fields/expandable.py @@ -1,13 +1,14 @@ import re +import netaddr from django import forms from django.utils.translation import gettext_lazy as _ from utilities.forms.constants import * -from utilities.forms.utils import expand_alphanumeric_pattern, expand_ipaddress_pattern +from utilities.forms.utils import expand_alphanumeric_pattern, expand_ipnetwork_pattern __all__ = ( - 'ExpandableIPAddressField', + 'ExpandableIPNetworkField', 'ExpandableNameField', ) @@ -34,22 +35,38 @@ class ExpandableNameField(forms.CharField): return [value] -class ExpandableIPAddressField(forms.CharField): +class ExpandableIPNetworkField(forms.CharField): """ - A field which allows for expansion of IP address ranges - Example: '192.0.2.[1-254]/24' => ['192.0.2.1/24', '192.0.2.2/24', '192.0.2.3/24' ... '192.0.2.254/24'] + A CharField that expands numeric range patterns in IPv4/IPv6 CIDR notation into multiple entries. + + Examples: + '192.0.2.[1-254]/32' => ['192.0.2.1/32', '192.0.2.2/32', ...] + '10.[0-3,10-13].0.0/16' => ['10.0.0.0/16', '10.1.0.0/16', ..., '10.10.0.0/16', ...] + '2001:db8:[0-f]::/64' => ['2001:db8:0::/64', '2001:db8:1::/64', ...] """ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) if not self.help_text: - self.help_text = _('Specify a numeric range to create multiple IPs.
' - 'Example: 192.0.2.[1,5,100-254]/24') + self.help_text = _( + 'Use bracket notation to specify numeric ranges for bulk creation (CIDR required).
' + 'Examples: 192.0.2.[1-10]/32, 10.[0-3,10-13].0.0/16, ' + '2001:db8:[a-f]::/64' + ) def to_python(self, value): - # Hackish address family detection but it's all we have to work with - if '.' in value and re.search(IP4_EXPANSION_PATTERN, value): - return list(expand_ipaddress_pattern(value, 4)) - if ':' in value and re.search(IP6_EXPANSION_PATTERN, value): - return list(expand_ipaddress_pattern(value, 6)) + if not value: + return [value] + + # Replace expansion brackets with a neutral value to get a parseable IP/CIDR + stripped = re.sub(r'\[[^\]]+\]', '0', value) + try: + family = netaddr.IPNetwork(stripped).version + except (netaddr.AddrFormatError, ValueError): + return [value] + + if family == 4 and re.search(IP4_EXPANSION_PATTERN, value): + return list(expand_ipnetwork_pattern(value, 4)) + if family == 6 and re.search(IP6_EXPANSION_PATTERN, value): + return list(expand_ipnetwork_pattern(value.lower(), 6)) return [value] diff --git a/netbox/utilities/forms/utils.py b/netbox/utilities/forms/utils.py index 1ed13cb9c..5e222c2bb 100644 --- a/netbox/utilities/forms/utils.py +++ b/netbox/utilities/forms/utils.py @@ -12,7 +12,7 @@ from .constants import * __all__ = ( 'add_blank_choice', 'expand_alphanumeric_pattern', - 'expand_ipaddress_pattern', + 'expand_ipnetwork_pattern', 'form_from_model', 'get_field_value', 'get_selected_values', @@ -106,9 +106,9 @@ def expand_alphanumeric_pattern(string): yield "{}{}{}".format(lead, i, remnant) -def expand_ipaddress_pattern(string, family): +def expand_ipnetwork_pattern(string, family): """ - Expand an IP address pattern into a list of strings. Examples: + Expand an IP network pattern into a list of strings. Examples: '192.0.2.[1,2,100-250]/24' => ['192.0.2.1/24', '192.0.2.2/24', '192.0.2.100/24' ... '192.0.2.250/24'] '2001:db8:0:[0,fd-ff]::/64' => ['2001:db8:0:0::/64', '2001:db8:0:fd::/64', ... '2001:db8:0:ff::/64'] """ @@ -124,7 +124,7 @@ def expand_ipaddress_pattern(string, family): parsed_range = parse_numeric_range(pattern, base) for i in parsed_range: if re.search(regex, remnant): - for string in expand_ipaddress_pattern(remnant, family): + for string in expand_ipnetwork_pattern(remnant, family): yield ''.join([lead, format(i, 'x' if family == 6 else 'd'), string]) else: yield ''.join([lead, format(i, 'x' if family == 6 else 'd'), remnant]) diff --git a/netbox/utilities/tests/test_forms.py b/netbox/utilities/tests/test_forms.py index 2224cc195..c8a0c46fa 100644 --- a/netbox/utilities/tests/test_forms.py +++ b/netbox/utilities/tests/test_forms.py @@ -6,13 +6,13 @@ from netbox.choices import ImportFormatChoices from utilities.forms.bulk_import import BulkImportForm from utilities.forms.fields.csv import CSVSelectWidget from utilities.forms.forms import BulkRenameForm -from utilities.forms.utils import expand_alphanumeric_pattern, expand_ipaddress_pattern, get_field_value +from utilities.forms.utils import expand_alphanumeric_pattern, expand_ipnetwork_pattern, get_field_value from utilities.forms.widgets.select import AvailableOptions, SelectedOptions -class ExpandIPAddress(TestCase): +class ExpandIPNetwork(TestCase): """ - Validate the operation of expand_ipaddress_pattern(). + Validate the operation of expand_ipnetwork_pattern(). """ def test_ipv4_range(self): input = '1.2.3.[9-10]/32' @@ -21,7 +21,7 @@ class ExpandIPAddress(TestCase): '1.2.3.10/32', ]) - self.assertEqual(sorted(expand_ipaddress_pattern(input, 4)), output) + self.assertEqual(sorted(expand_ipnetwork_pattern(input, 4)), output) def test_ipv4_set(self): input = '1.2.3.[4,44]/32' @@ -30,7 +30,7 @@ class ExpandIPAddress(TestCase): '1.2.3.44/32', ]) - self.assertEqual(sorted(expand_ipaddress_pattern(input, 4)), output) + self.assertEqual(sorted(expand_ipnetwork_pattern(input, 4)), output) def test_ipv4_multiple_ranges(self): input = '1.[9-10].3.[9-11]/32' @@ -43,7 +43,7 @@ class ExpandIPAddress(TestCase): '1.10.3.11/32', ]) - self.assertEqual(sorted(expand_ipaddress_pattern(input, 4)), output) + self.assertEqual(sorted(expand_ipnetwork_pattern(input, 4)), output) def test_ipv4_multiple_sets(self): input = '1.[2,22].3.[4,44]/32' @@ -54,7 +54,7 @@ class ExpandIPAddress(TestCase): '1.22.3.44/32', ]) - self.assertEqual(sorted(expand_ipaddress_pattern(input, 4)), output) + self.assertEqual(sorted(expand_ipnetwork_pattern(input, 4)), output) def test_ipv4_set_and_range(self): input = '1.[2,22].3.[9-11]/32' @@ -67,7 +67,7 @@ class ExpandIPAddress(TestCase): '1.22.3.11/32', ]) - self.assertEqual(sorted(expand_ipaddress_pattern(input, 4)), output) + self.assertEqual(sorted(expand_ipnetwork_pattern(input, 4)), output) def test_ipv6_range(self): input = 'fec::abcd:[9-b]/64' @@ -77,7 +77,7 @@ class ExpandIPAddress(TestCase): 'fec::abcd:b/64', ]) - self.assertEqual(sorted(expand_ipaddress_pattern(input, 6)), output) + self.assertEqual(sorted(expand_ipnetwork_pattern(input, 6)), output) def test_ipv6_range_multichar_field(self): input = 'fec::abcd:[f-11]/64' @@ -87,7 +87,7 @@ class ExpandIPAddress(TestCase): 'fec::abcd:11/64', ]) - self.assertEqual(sorted(expand_ipaddress_pattern(input, 6)), output) + self.assertEqual(sorted(expand_ipnetwork_pattern(input, 6)), output) def test_ipv6_set(self): input = 'fec::abcd:[9,ab]/64' @@ -96,7 +96,7 @@ class ExpandIPAddress(TestCase): 'fec::abcd:ab/64', ]) - self.assertEqual(sorted(expand_ipaddress_pattern(input, 6)), output) + self.assertEqual(sorted(expand_ipnetwork_pattern(input, 6)), output) def test_ipv6_multiple_ranges(self): input = 'fec::[1-2]bcd:[9-b]/64' @@ -109,7 +109,7 @@ class ExpandIPAddress(TestCase): 'fec::2bcd:b/64', ]) - self.assertEqual(sorted(expand_ipaddress_pattern(input, 6)), output) + self.assertEqual(sorted(expand_ipnetwork_pattern(input, 6)), output) def test_ipv6_multiple_sets(self): input = 'fec::[a,f]bcd:[9,ab]/64' @@ -120,7 +120,7 @@ class ExpandIPAddress(TestCase): 'fec::fbcd:ab/64', ]) - self.assertEqual(sorted(expand_ipaddress_pattern(input, 6)), output) + self.assertEqual(sorted(expand_ipnetwork_pattern(input, 6)), output) def test_ipv6_set_and_range(self): input = 'fec::[dead,beaf]:[9-b]/64' @@ -133,41 +133,41 @@ class ExpandIPAddress(TestCase): 'fec::beaf:b/64', ]) - self.assertEqual(sorted(expand_ipaddress_pattern(input, 6)), output) + self.assertEqual(sorted(expand_ipnetwork_pattern(input, 6)), output) def test_invalid_address_family(self): with self.assertRaisesRegex(Exception, 'Invalid IP address family: 5'): - sorted(expand_ipaddress_pattern(None, 5)) + sorted(expand_ipnetwork_pattern(None, 5)) def test_invalid_non_pattern(self): with self.assertRaises(ValueError): - sorted(expand_ipaddress_pattern('1.2.3.4/32', 4)) + sorted(expand_ipnetwork_pattern('1.2.3.4/32', 4)) def test_invalid_range(self): with self.assertRaises(ValueError): - sorted(expand_ipaddress_pattern('1.2.3.[4-]/32', 4)) + sorted(expand_ipnetwork_pattern('1.2.3.[4-]/32', 4)) with self.assertRaises(ValueError): - sorted(expand_ipaddress_pattern('1.2.3.[-4]/32', 4)) + sorted(expand_ipnetwork_pattern('1.2.3.[-4]/32', 4)) with self.assertRaises(ValueError): - sorted(expand_ipaddress_pattern('1.2.3.[4--5]/32', 4)) + sorted(expand_ipnetwork_pattern('1.2.3.[4--5]/32', 4)) def test_invalid_range_bounds(self): - self.assertEqual(sorted(expand_ipaddress_pattern('1.2.3.[4-3]/32', 6)), []) + self.assertEqual(sorted(expand_ipnetwork_pattern('1.2.3.[4-3]/32', 6)), []) def test_invalid_set(self): with self.assertRaises(ValueError): - sorted(expand_ipaddress_pattern('1.2.3.[4]/32', 4)) + sorted(expand_ipnetwork_pattern('1.2.3.[4]/32', 4)) with self.assertRaises(ValueError): - sorted(expand_ipaddress_pattern('1.2.3.[4,]/32', 4)) + sorted(expand_ipnetwork_pattern('1.2.3.[4,]/32', 4)) with self.assertRaises(ValueError): - sorted(expand_ipaddress_pattern('1.2.3.[,4]/32', 4)) + sorted(expand_ipnetwork_pattern('1.2.3.[,4]/32', 4)) with self.assertRaises(ValueError): - sorted(expand_ipaddress_pattern('1.2.3.[4,,5]/32', 4)) + sorted(expand_ipnetwork_pattern('1.2.3.[4,,5]/32', 4)) class ExpandAlphanumeric(TestCase): From 775d6aa9362d2bc310a39f967b89699e68696222 Mon Sep 17 00:00:00 2001 From: Martin Hauser Date: Fri, 13 Mar 2026 15:10:46 +0100 Subject: [PATCH 022/104] feat(ipam): Add HTMX support to prefix bulk add form Enable dynamic form updates in the prefix bulk add view by introducing HTMX partial rendering. Inherit from PrefixForm to support scope and VLAN fields, and add htmx_template_name for efficient field updates. --- netbox/ipam/forms/model_forms.py | 31 +++++++------------ netbox/netbox/views/generic/bulk_views.py | 13 ++++++++ netbox/templates/generic/bulk_add.html | 6 ++-- netbox/templates/generic/object_edit.html | 1 + netbox/templates/htmx/bulk_add_form.html | 22 +++++++++++++ .../ipam/inc/prefix_edit_header.html | 4 +-- 6 files changed, 53 insertions(+), 24 deletions(-) create mode 100644 netbox/templates/htmx/bulk_add_form.html diff --git a/netbox/ipam/forms/model_forms.py b/netbox/ipam/forms/model_forms.py index d3159320d..c8c488329 100644 --- a/netbox/ipam/forms/model_forms.py +++ b/netbox/ipam/forms/model_forms.py @@ -250,31 +250,22 @@ class PrefixForm(TenancyForm, ScopedForm, PrimaryModelForm): self.fields['vlan'].widget.attrs.pop('data-dynamic-params', None) -class PrefixBulkAddForm(TenancyForm, NetBoxModelForm): - vrf = DynamicModelChoiceField( - queryset=VRF.objects.all(), - required=False, - label=_('VRF') - ) - role = DynamicModelChoiceField( - label=_('Role'), - queryset=Role.objects.all(), - required=False, - quick_add=True - ) +class PrefixBulkAddForm(PrefixForm): + """ + Subclass of PrefixForm for bulk creation. The prefix field is inherited + but excluded from fieldsets — it is populated programmatically by BulkCreateView + from the expanded pattern. + """ fieldsets = ( - FieldSet('status', 'role', 'vrf', 'is_pool', 'mark_utilized', 'description', 'tags', name=_('Prefix')), + FieldSet( + 'status', 'vrf', 'role', 'is_pool', 'mark_utilized', 'description', 'tags', name=_('Prefix') + ), + FieldSet('scope_type', 'scope', name=_('Scope')), + FieldSet('vlan', name=_('VLAN Assignment')), FieldSet('tenant_group', 'tenant', name=_('Tenancy')), ) - class Meta: - model = Prefix - fields = [ - 'prefix', 'vrf', 'status', 'role', 'is_pool', 'mark_utilized', 'description', 'tenant_group', 'tenant', - 'tags', - ] - class IPRangeForm(TenancyForm, PrimaryModelForm): vrf = DynamicModelChoiceField( diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py index ec18412a4..9db40a0b0 100644 --- a/netbox/netbox/views/generic/bulk_views.py +++ b/netbox/netbox/views/generic/bulk_views.py @@ -225,6 +225,7 @@ class BulkCreateView(GetReturnURLMixin, BaseMultiObjectView): form = None model_form = None pattern_target = '' + htmx_template_name = 'htmx/bulk_add_form.html' def get_required_permission(self): return get_permission_for_model(self.queryset.model, 'add') @@ -280,6 +281,12 @@ class BulkCreateView(GetReturnURLMixin, BaseMultiObjectView): form = self.form() model_form = self.model_form(initial=initial) + # HTMX partial: only re-render the model form fields + if htmx_partial(request): + return render(request, self.htmx_template_name, { + 'model_form': model_form, + }) + return render(request, self.template_name, self._get_context(request, form, model_form)) def post(self, request): @@ -288,6 +295,12 @@ class BulkCreateView(GetReturnURLMixin, BaseMultiObjectView): form = self.form(request.POST) model_form = self.model_form(request.POST) + # HTMX partial: only re-render the model form fields + if htmx_partial(request): + return render(request, self.htmx_template_name, { + 'model_form': model_form, + }) + if form.is_valid(): logger.debug("Form validation was successful") diff --git a/netbox/templates/generic/bulk_add.html b/netbox/templates/generic/bulk_add.html index ebc7bc0be..b9c3999a1 100644 --- a/netbox/templates/generic/bulk_add.html +++ b/netbox/templates/generic/bulk_add.html @@ -20,14 +20,16 @@ {% endblock %} -{% block form %} +{% block pre_form_fields %}

{% trans "Pattern" %}

{% render_field form.pattern %}
+{% endblock pre_form_fields %} +{% block form %} {% if model_form.fieldsets %} {% for fieldset in model_form.fieldsets %} {% render_fieldset model_form fieldset %} @@ -46,4 +48,4 @@ {% render_custom_fields model_form %}
{% endif %} -{% endblock %} +{% endblock form %} diff --git a/netbox/templates/generic/object_edit.html b/netbox/templates/generic/object_edit.html index 3e0a096fa..c24c27929 100644 --- a/netbox/templates/generic/object_edit.html +++ b/netbox/templates/generic/object_edit.html @@ -61,6 +61,7 @@ Context:
{% csrf_token %} + {% block pre_form_fields %}{% endblock pre_form_fields %}
{% block form %} {% include 'htmx/form.html' %} diff --git a/netbox/templates/htmx/bulk_add_form.html b/netbox/templates/htmx/bulk_add_form.html new file mode 100644 index 000000000..7ea742b30 --- /dev/null +++ b/netbox/templates/htmx/bulk_add_form.html @@ -0,0 +1,22 @@ +{% load helpers %} +{% load form_helpers %} +{% load i18n %} + +{% if model_form.fieldsets %} + {% for fieldset in model_form.fieldsets %} + {% render_fieldset model_form fieldset %} + {% endfor %} +{% else %} +
+ {% render_form model_form %} +
+{% endif %} + +{% if model_form.custom_fields %} +
+
+

{% trans "Custom Fields" %}

+
+ {% render_custom_fields model_form %} +
+{% endif %} diff --git a/netbox/templates/ipam/inc/prefix_edit_header.html b/netbox/templates/ipam/inc/prefix_edit_header.html index db8c12d46..bc63defe9 100644 --- a/netbox/templates/ipam/inc/prefix_edit_header.html +++ b/netbox/templates/ipam/inc/prefix_edit_header.html @@ -3,8 +3,8 @@
+ {# Meta fields #} + {% if form.background_job %} +
+ {% render_field form.background_job %} +
+ {% endif %}
{% trans "Cancel" %} diff --git a/netbox/virtualization/forms/bulk_create.py b/netbox/virtualization/forms/bulk_create.py index 078fb2f43..a1d7c5e54 100644 --- a/netbox/virtualization/forms/bulk_create.py +++ b/netbox/virtualization/forms/bulk_create.py @@ -3,6 +3,7 @@ from django.utils.translation import gettext_lazy as _ from utilities.forms import form_from_model from utilities.forms.fields import ExpandableNameField +from utilities.forms.mixins import BackgroundJobMixin from virtualization.models import VirtualDisk, VirtualMachine, VMInterface __all__ = ( @@ -11,7 +12,7 @@ __all__ = ( ) -class VirtualMachineBulkAddComponentForm(forms.Form): +class VirtualMachineBulkAddComponentForm(BackgroundJobMixin, forms.Form): pk = forms.ModelMultipleChoiceField( queryset=VirtualMachine.objects.all(), widget=forms.MultipleHiddenInput() From 8a58d760faa135a472f16e9e9a0278c109a83bab Mon Sep 17 00:00:00 2001 From: Arthur Date: Thu, 26 Mar 2026 13:25:49 -0700 Subject: [PATCH 041/104] cleanup --- netbox/templates/generic/bulk_add_component.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/netbox/templates/generic/bulk_add_component.html b/netbox/templates/generic/bulk_add_component.html index 078a45930..95f323726 100644 --- a/netbox/templates/generic/bulk_add_component.html +++ b/netbox/templates/generic/bulk_add_component.html @@ -58,8 +58,7 @@ Context:

{{ model_name|title }} {% trans "to Add" %}

{% for field in form.visible_fields %} - {% if form.meta_fields and field.name in form.meta_fields %} - {% else %} + {% if not form.meta_fields or field.name not in form.meta_fields %} {% render_field field %} {% endif %} {% endfor %} From 3ec055168067cacb34b6a9393609924a7c6b95bb Mon Sep 17 00:00:00 2001 From: Arthur Date: Thu, 26 Mar 2026 13:37:40 -0700 Subject: [PATCH 042/104] cleanup --- netbox/netbox/views/generic/bulk_views.py | 25 +++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py index 243036091..932421fe9 100644 --- a/netbox/netbox/views/generic/bulk_views.py +++ b/netbox/netbox/views/generic/bulk_views.py @@ -1138,10 +1138,10 @@ class BulkComponentCreateView(GetReturnURLMixin, BaseMultiObjectView): logger.debug("Form validation was successful") # If indicated, defer this request to a background job & redirect the user - if form.cleaned_data.get('background_job'): + if form.cleaned_data['background_job']: job_name = _('Bulk add {count} {object_type}').format( count=len(form.cleaned_data['pk']), - object_type=model_name, + object_type=self.queryset.model._meta.verbose_name_plural, ) if process_request_as_job(self.__class__, request, name=job_name): return redirect(self.get_return_url(request)) @@ -1176,7 +1176,10 @@ class BulkComponentCreateView(GetReturnURLMixin, BaseMultiObjectView): else: for field, errors in component_form.errors.as_data().items(): for e in errors: - form.add_error(field, '{}: {}'.format(obj, ', '.join(e))) + err_msg = '{}: {}'.format(obj, ', '.join(e)) + form.add_error(field, err_msg) + if is_background_request(request): + request.job.logger.error(err_msg) # Enforce object-level permissions component_ids = [obj.pk for obj in new_components] @@ -1185,18 +1188,24 @@ class BulkComponentCreateView(GetReturnURLMixin, BaseMultiObjectView): except IntegrityError: clear_events.send(sender=self) + if is_background_request(request): + request.job.logger.error("An integrity error occurred while creating components") + raise JobFailed except (AbortRequest, PermissionsViolation) as e: logger.debug(e.message) form.add_error(None, e.message) clear_events.send(sender=self) + if is_background_request(request): + request.job.logger.error(e.message) + raise JobFailed if not form.errors: - msg = "Added {} {} to {} {}.".format( - len(new_components), - model_name, - len(form.cleaned_data['pk']), - parent_model_name + msg = _("Added {count} {component} to {parent_count} {parent}.").format( + count=len(new_components), + component=model_name, + parent_count=len(form.cleaned_data['pk']), + parent=parent_model_name, ) logger.info(msg) From 296b89ae02c8f1812d77b0273f5df8197742fd43 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 26 Mar 2026 12:13:28 -0400 Subject: [PATCH 043/104] Fixes #21747: Skip search caching when encountering an invalid schema during migrations (#21748) --- netbox/netbox/search/backends.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/netbox/netbox/search/backends.py b/netbox/netbox/search/backends.py index 12dfbdcff..661134c95 100644 --- a/netbox/netbox/search/backends.py +++ b/netbox/netbox/search/backends.py @@ -1,9 +1,11 @@ +import logging from collections import defaultdict import netaddr from django.conf import settings from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ImproperlyConfigured +from django.db import ProgrammingError from django.db.models import F, Q, Window, prefetch_related_objects from django.db.models.fields.related import ForeignKey from django.db.models.functions import window @@ -24,6 +26,8 @@ from . import FieldTypes, LookupTypes, get_indexer DEFAULT_LOOKUP_TYPE = LookupTypes.PARTIAL MAX_RESULTS = 1000 +logger = logging.getLogger(__name__) + class SearchBackend: """ @@ -63,7 +67,12 @@ class SearchBackend: """ Receiver for the post_save signal, responsible for caching object creation/changes. """ - self.cache(instance, remove_existing=not created) + try: + self.cache(instance, remove_existing=not created) + except ProgrammingError as e: + # The schema may be incomplete during migrations; skip caching. + logger.warning(f"Skipping search cache update due to schema error: {e}") + pass def removal_handler(self, sender, instance, **kwargs): """ From 9bc66ee0bf54bf438422cc6cde860d54006d593e Mon Sep 17 00:00:00 2001 From: Arthur Date: Thu, 26 Mar 2026 15:00:52 -0700 Subject: [PATCH 044/104] cleanup --- netbox/netbox/views/generic/bulk_views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py index 932421fe9..be3cc619e 100644 --- a/netbox/netbox/views/generic/bulk_views.py +++ b/netbox/netbox/views/generic/bulk_views.py @@ -1189,7 +1189,7 @@ class BulkComponentCreateView(GetReturnURLMixin, BaseMultiObjectView): except IntegrityError: clear_events.send(sender=self) if is_background_request(request): - request.job.logger.error("An integrity error occurred while creating components") + request.job.logger.error(_("An integrity error occurred while creating components")) raise JobFailed except (AbortRequest, PermissionsViolation) as e: From c7504628bde420532baa48a0e69d232edacfb3e9 Mon Sep 17 00:00:00 2001 From: Martin Hauser Date: Mon, 30 Mar 2026 17:42:05 +0200 Subject: [PATCH 045/104] feat(dcim): Add changelog message support to bulk component creation (#21769) Add ChangelogMessageMixin to DeviceBulkAddComponentForm and capture changelog_message during bulk component creation. Ensure message is applied to each created component instance. Add test coverage for changelog message propagation. --- netbox/dcim/forms/bulk_create.py | 4 +- netbox/dcim/tests/test_views.py | 48 ++++++++++++++++++- netbox/netbox/views/generic/bulk_views.py | 3 ++ .../templates/generic/bulk_add_component.html | 14 ++++-- 4 files changed, 62 insertions(+), 7 deletions(-) diff --git a/netbox/dcim/forms/bulk_create.py b/netbox/dcim/forms/bulk_create.py index c6ac6271e..b9f2c1748 100644 --- a/netbox/dcim/forms/bulk_create.py +++ b/netbox/dcim/forms/bulk_create.py @@ -3,7 +3,7 @@ from django.utils.translation import gettext_lazy as _ from dcim.models import * from extras.models import Tag -from netbox.forms.mixins import CustomFieldsMixin +from netbox.forms.mixins import ChangelogMessageMixin, CustomFieldsMixin from utilities.forms import form_from_model from utilities.forms.fields import DynamicModelMultipleChoiceField, ExpandableNameField from utilities.forms.mixins import BackgroundJobMixin @@ -28,7 +28,7 @@ __all__ = ( # Device components # -class DeviceBulkAddComponentForm(BackgroundJobMixin, CustomFieldsMixin, ComponentCreateForm): +class DeviceBulkAddComponentForm(BackgroundJobMixin, ChangelogMessageMixin, CustomFieldsMixin, ComponentCreateForm): pk = forms.ModelMultipleChoiceField( queryset=Device.objects.all(), widget=forms.MultipleHiddenInput() diff --git a/netbox/dcim/tests/test_views.py b/netbox/dcim/tests/test_views.py index 3f7e90952..6aeac74d7 100644 --- a/netbox/dcim/tests/test_views.py +++ b/netbox/dcim/tests/test_views.py @@ -3,11 +3,13 @@ from decimal import Decimal from zoneinfo import ZoneInfo import yaml +from django.contrib.contenttypes.models import ContentType from django.test import override_settings, tag from django.urls import reverse from netaddr import EUI -from core.models import ObjectType +from core.choices import ObjectChangeActionChoices +from core.models import ObjectChange, ObjectType from dcim.choices import * from dcim.constants import * from dcim.models import * @@ -2741,6 +2743,50 @@ class ConsolePortTestCase(ViewTestCases.DeviceComponentViewTestCase): f"{console_ports[2].pk},Console Port 9,New description9", ) + @override_settings(EXEMPT_VIEW_PERMISSIONS=['*'], EXEMPT_EXCLUDE_MODELS=[]) + def test_bulk_add_components_with_changelog_message(self): + device1 = Device.objects.get(name='Device 1') + device2 = create_test_device('Device 2') + changelog_message = 'Bulk-created console ports' + + obj_perm = ObjectPermission( + name='Test permission', + actions=['add'], + ) + obj_perm.save() + obj_perm.users.add(self.user) + obj_perm.object_types.add(ObjectType.objects.get_for_model(self.model)) + + request = { + 'path': reverse('dcim:device_bulk_add_consoleport'), + 'data': post_data({ + 'pk': [device1.pk, device2.pk], + 'name': 'Console Port Bulk', + 'type': ConsolePortTypeChoices.TYPE_RJ45, + 'description': 'Bulk-created console port', + 'changelog_message': changelog_message, + '_create': True, + }), + } + + initial_count = self._get_queryset().count() + response = self.client.post(**request) + self.assertHttpStatus(response, 302) + self.assertEqual(initial_count + 2, self._get_queryset().count()) + + created_ports = list(ConsolePort.objects.filter(name='Console Port Bulk').order_by('device_id')) + self.assertEqual(len(created_ports), 2) + self.assertEqual([port.device_id for port in created_ports], [device1.pk, device2.pk]) + + objectchanges = ObjectChange.objects.filter( + action=ObjectChangeActionChoices.ACTION_CREATE, + changed_object_type=ContentType.objects.get_for_model(ConsolePort), + changed_object_id__in=[port.pk for port in created_ports], + ) + self.assertEqual(objectchanges.count(), 2) + for objectchange in objectchanges: + self.assertEqual(objectchange.message, changelog_message) + @override_settings(EXEMPT_VIEW_PERMISSIONS=['*']) def test_trace(self): consoleport = ConsolePort.objects.first() diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py index be3cc619e..ce2efdf08 100644 --- a/netbox/netbox/views/generic/bulk_views.py +++ b/netbox/netbox/views/generic/bulk_views.py @@ -1148,6 +1148,7 @@ class BulkComponentCreateView(GetReturnURLMixin, BaseMultiObjectView): new_components = [] data = deepcopy(form.cleaned_data) + changelog_message = data.pop('changelog_message', '') data.pop('background_job', None) replication_data = { field: data.pop(field) for field in form.replication_fields @@ -1170,6 +1171,8 @@ class BulkComponentCreateView(GetReturnURLMixin, BaseMultiObjectView): component_form = self.model_form(component_data) if component_form.is_valid(): + if changelog_message: + component_form.instance._changelog_message = changelog_message instance = component_form.save() logger.debug(f"Created {instance} on {instance.parent_object}") new_components.append(instance) diff --git a/netbox/templates/generic/bulk_add_component.html b/netbox/templates/generic/bulk_add_component.html index 95f323726..4ca5ac3cf 100644 --- a/netbox/templates/generic/bulk_add_component.html +++ b/netbox/templates/generic/bulk_add_component.html @@ -64,11 +64,17 @@ Context: {% endfor %}
+ {# Meta fields #} - {% if form.background_job %} -
- {% render_field form.background_job %} -
+ {% if form.background_job or form.changelog_message %} +
+ {% if form.changelog_message %} + {% render_field form.changelog_message %} + {% endif %} + {% if form.background_job %} + {% render_field form.background_job %} + {% endif %} +
{% endif %}
From 2389feea6b89172b619d816aa9603eb268f9e73f Mon Sep 17 00:00:00 2001 From: Martin Hauser Date: Mon, 30 Mar 2026 20:06:50 +0200 Subject: [PATCH 046/104] feat(virtualization): Add Virtual Machine Type model Introduce `VirtualMachineType` to classify virtual machines and apply default platform, vCPU, and memory values when creating a VM. This adds the new model and its relationship to `VirtualMachine`, and wires it through forms, filtersets, tables, views, the REST API, GraphQL, navigation, search, documentation, and tests. Explicit values set on a virtual machine continue to take precedence, and changes to a type do not retroactively update existing VMs. --- docs/development/models.md | 2 + docs/features/virtualization.md | 30 +- docs/models/virtualization/virtualmachine.md | 12 +- .../virtualization/virtualmachinetype.md | 27 ++ mkdocs.yml | 1 + netbox/extras/tests/test_filtersets.py | 1 + netbox/netbox/navigation/menu.py | 1 + .../virtualization/virtualmachinetype.html | 10 + .../api/serializers_/virtualmachines.py | 39 ++- netbox/virtualization/api/urls.py | 3 + netbox/virtualization/api/views.py | 14 + netbox/virtualization/apps.py | 4 +- netbox/virtualization/filtersets.py | 52 +++ netbox/virtualization/forms/bulk_edit.py | 41 ++- netbox/virtualization/forms/bulk_import.py | 35 ++- netbox/virtualization/forms/filtersets.py | 54 +++- netbox/virtualization/forms/model_forms.py | 80 ++++- netbox/virtualization/graphql/filters.py | 24 +- netbox/virtualization/graphql/schema.py | 5 +- netbox/virtualization/graphql/types.py | 15 + .../migrations/0054_virtualmachinetype.py | 106 +++++++ .../virtualization/models/virtualmachines.py | 109 ++++++- netbox/virtualization/search.py | 12 + .../virtualization/tables/virtualmachines.py | 47 ++- netbox/virtualization/tests/test_api.py | 212 +++++++++++-- .../virtualization/tests/test_filtersets.py | 148 ++++++++- netbox/virtualization/tests/test_models.py | 295 +++++++++++++++++- netbox/virtualization/tests/test_views.py | 207 +++++++++--- netbox/virtualization/ui/panels.py | 33 ++ netbox/virtualization/urls.py | 3 + netbox/virtualization/views.py | 74 +++++ 31 files changed, 1574 insertions(+), 122 deletions(-) create mode 100644 docs/models/virtualization/virtualmachinetype.md create mode 100644 netbox/templates/virtualization/virtualmachinetype.html create mode 100644 netbox/virtualization/migrations/0054_virtualmachinetype.py diff --git a/docs/development/models.md b/docs/development/models.md index b6ff436a0..aabca514d 100644 --- a/docs/development/models.md +++ b/docs/development/models.md @@ -74,6 +74,7 @@ These are considered the "core" application models which are used to model netwo * [tenancy.Tenant](../models/tenancy/tenant.md) * [virtualization.Cluster](../models/virtualization/cluster.md) * [virtualization.VirtualMachine](../models/virtualization/virtualmachine.md) +* [virtualization.VirtualMachineType](../models/virtualization/virtualmachinetype.md) * [vpn.IKEPolicy](../models/vpn/ikepolicy.md) * [vpn.IKEProposal](../models/vpn/ikeproposal.md) * [vpn.IPSecPolicy](../models/vpn/ipsecpolicy.md) @@ -93,6 +94,7 @@ Organization models are used to organize and classify primary models. * [dcim.DeviceRole](../models/dcim/devicerole.md) * [dcim.Manufacturer](../models/dcim/manufacturer.md) * [dcim.Platform](../models/dcim/platform.md) +* [dcim.RackGroup](../models/dcim/rackgroup.md) * [dcim.RackRole](../models/dcim/rackrole.md) * [ipam.ASNRange](../models/ipam/asnrange.md) * [ipam.RIR](../models/ipam/rir.md) diff --git a/docs/features/virtualization.md b/docs/features/virtualization.md index 5259ce02f..4a00c6ced 100644 --- a/docs/features/virtualization.md +++ b/docs/features/virtualization.md @@ -5,27 +5,37 @@ Virtual machines, clusters, and standalone hypervisors can be modeled in NetBox ```mermaid flowchart TD ClusterGroup & ClusterType --> Cluster - Cluster --> VirtualMachine + VirtualMachineType --> VirtualMachine Device --> VirtualMachine + Cluster --> VirtualMachine Platform --> VirtualMachine VirtualMachine --> VMInterface -click Cluster "../../models/virtualization/cluster/" -click ClusterGroup "../../models/virtualization/clustergroup/" -click ClusterType "../../models/virtualization/clustertype/" -click Device "../../models/dcim/device/" -click Platform "../../models/dcim/platform/" -click VirtualMachine "../../models/virtualization/virtualmachine/" -click VMInterface "../../models/virtualization/vminterface/" + click Cluster "../../models/virtualization/cluster/" + click ClusterGroup "../../models/virtualization/clustergroup/" + click ClusterType "../../models/virtualization/clustertype/" + click VirtualMachineType "../../models/virtualization/virtualmachinetype/" + click Device "../../models/dcim/device/" + click Platform "../../models/dcim/platform/" + click VirtualMachine "../../models/virtualization/virtualmachine/" + click VMInterface "../../models/virtualization/vminterface/" ``` ## Clusters -A cluster is one or more physical host devices on which virtual machines can run. Each cluster must have a type and operational status, and may be assigned to a group. (Both types and groups are user-defined.) Each cluster may designate one or more devices as hosts, however this is optional. +A cluster is one or more physical host devices on which virtual machines can run. + +Each cluster must have a type and operational status, and may be assigned to a group. (Both types and groups are user-defined.) Each cluster may designate one or more devices as hosts, however this is optional. + +## Virtual Machine Types + +A virtual machine type provides reusable classification for virtual machines and can define create-time defaults for platform, vCPUs, and memory. This is useful when multiple virtual machines share a common sizing or profile while still allowing per-instance overrides after creation. ## Virtual Machines -A virtual machine is a virtualized compute instance. These behave in NetBox very similarly to device objects, but without any physical attributes. For example, a VM may have interfaces assigned to it with IP addresses and VLANs, however its interfaces cannot be connected via cables (because they are virtual). Each VM may define its compute, memory, and storage resources as well. +A virtual machine is a virtualized compute instance. These behave in NetBox very similarly to device objects, but without any physical attributes. + +For example, a VM may have interfaces assigned to it with IP addresses and VLANs, however its interfaces cannot be connected via cables (because they are virtual). Each VM may define its compute, memory, and storage resources as well. A VM can optionally be assigned a [virtual machine type](../models/virtualization/virtualmachinetype.md) to classify it and provide default values for selected attributes at creation time. A VM can be placed in one of three ways: diff --git a/docs/models/virtualization/virtualmachine.md b/docs/models/virtualization/virtualmachine.md index 61a737552..f8786796c 100644 --- a/docs/models/virtualization/virtualmachine.md +++ b/docs/models/virtualization/virtualmachine.md @@ -13,6 +13,12 @@ The virtual machine's configured name. Must be unique within its scoping context - If assigned to a **cluster**: unique within the cluster and tenant. - If assigned to a **device** (no cluster): unique within the device and tenant. +### Type + +The [virtual machine type](./virtualmachinetype.md) assigned to the VM. A type classifies a virtual machine and can provide default values for platform, vCPUs, and memory when the VM is created. + +Changes made to a virtual machine type do **not** apply retroactively to existing virtual machines. + ### Role The functional role assigned to the VM. @@ -45,7 +51,7 @@ The location or host for this VM. At least one must be specified: ### Platform -A VM may be associated with a particular [platform](../dcim/platform.md) to indicate its operating system. +A VM may be associated with a particular [platform](../dcim/platform.md) to indicate its operating system. If a virtual machine type defines a default platform, it will be applied when the VM is created unless an explicit platform is specified. ### Primary IPv4 & IPv6 Addresses @@ -56,11 +62,11 @@ Each VM may designate one primary IPv4 address and/or one primary IPv6 address f ### vCPUs -The number of virtual CPUs provisioned. A VM may be allocated a partial vCPU count (e.g. 1.5 vCPU). +The number of virtual CPUs provisioned. A VM may be allocated a partial vCPU count (e.g. 1.5 vCPU). If a virtual machine type defines a default vCPU allocation, it will be applied when the VM is created unless an explicit value is specified. ### Memory -The amount of running memory provisioned, in megabytes. +The amount of running memory provisioned, in megabytes. If a virtual machine type defines a default memory allocation, it will be applied when the VM is created unless an explicit value is specified. ### Disk diff --git a/docs/models/virtualization/virtualmachinetype.md b/docs/models/virtualization/virtualmachinetype.md new file mode 100644 index 000000000..daf213c56 --- /dev/null +++ b/docs/models/virtualization/virtualmachinetype.md @@ -0,0 +1,27 @@ +# Virtual Machine Types + +A virtual machine type defines a reusable classification and default configuration for [virtual machines](./virtualmachine.md). + +A type can optionally provide default values for a VM's [platform](../dcim/platform.md), vCPU allocation, and memory allocation. When a virtual machine is created with an assigned type, any unset values among these fields will inherit their defaults from the type. Changes made to a virtual machine type do **not** apply retroactively to existing virtual machines. + +## Fields + +### Name + +A unique human-friendly name. + +### Slug + +A unique URL-friendly identifier. (This value can be used for filtering.) + +### Default Platform + +If defined, virtual machines instantiated with this type will automatically inherit the selected platform when no explicit platform is provided. + +### Default vCPUs + +The default number of vCPUs to assign when creating a virtual machine from this type. + +### Default Memory + +The default amount of memory, in megabytes, to assign when creating a virtual machine from this type. diff --git a/mkdocs.yml b/mkdocs.yml index 3c78965b2..37ec0947f 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -288,6 +288,7 @@ nav: - VMInterface: 'models/virtualization/vminterface.md' - VirtualDisk: 'models/virtualization/virtualdisk.md' - VirtualMachine: 'models/virtualization/virtualmachine.md' + - VirtualMachineType: 'models/virtualization/virtualmachinetype.md' - VPN: - IKEPolicy: 'models/vpn/ikepolicy.md' - IKEProposal: 'models/vpn/ikeproposal.md' diff --git a/netbox/extras/tests/test_filtersets.py b/netbox/extras/tests/test_filtersets.py index 56e7f27f7..d661854d6 100644 --- a/netbox/extras/tests/test_filtersets.py +++ b/netbox/extras/tests/test_filtersets.py @@ -1305,6 +1305,7 @@ class TagTestCase(TestCase, ChangeLoggedFilterSetTests): 'virtualdevicecontext', 'virtualdisk', 'virtualmachine', + 'virtualmachinetype', 'vlan', 'vlangroup', 'vlantranslationpolicy', diff --git a/netbox/netbox/navigation/menu.py b/netbox/netbox/navigation/menu.py index 399997593..7b34c2f1d 100644 --- a/netbox/netbox/navigation/menu.py +++ b/netbox/netbox/navigation/menu.py @@ -268,6 +268,7 @@ VIRTUALIZATION_MENU = Menu( get_model_item('virtualization', 'virtualmachine', _('Virtual Machines')), get_model_item('virtualization', 'vminterface', _('Interfaces')), get_model_item('virtualization', 'virtualdisk', _('Virtual Disks')), + get_model_item('virtualization', 'virtualmachinetype', _('Virtual Machine Types')), ), ), MenuGroup( diff --git a/netbox/templates/virtualization/virtualmachinetype.html b/netbox/templates/virtualization/virtualmachinetype.html new file mode 100644 index 000000000..86958b930 --- /dev/null +++ b/netbox/templates/virtualization/virtualmachinetype.html @@ -0,0 +1,10 @@ +{% extends 'generic/object.html' %} +{% load i18n %} + +{% block extra_controls %} + {% if perms.virtualization.add_virtualmachine %} + + {% trans "Add Virtual Machine" %} + + {% endif %} +{% endblock extra_controls %} diff --git a/netbox/virtualization/api/serializers_/virtualmachines.py b/netbox/virtualization/api/serializers_/virtualmachines.py index 70355a1bb..ac2621511 100644 --- a/netbox/virtualization/api/serializers_/virtualmachines.py +++ b/netbox/virtualization/api/serializers_/virtualmachines.py @@ -16,10 +16,10 @@ from netbox.api.fields import ChoiceField, SerializedPKRelatedField from netbox.api.serializers import NetBoxModelSerializer, PrimaryModelSerializer from tenancy.api.serializers_.tenants import TenantSerializer from users.api.serializers_.mixins import OwnerMixin -from virtualization.choices import * -from virtualization.models import VirtualDisk, VirtualMachine, VMInterface from vpn.api.serializers_.l2vpn import L2VPNTerminationSerializer +from ...choices import * +from ...models import VirtualDisk, VirtualMachine, VirtualMachineType, VMInterface from .clusters import ClusterSerializer from .nested import NestedVMInterfaceSerializer @@ -27,11 +27,29 @@ __all__ = ( 'VMInterfaceSerializer', 'VirtualDiskSerializer', 'VirtualMachineSerializer', + 'VirtualMachineTypeSerializer', 'VirtualMachineWithConfigContextSerializer', ) +class VirtualMachineTypeSerializer(PrimaryModelSerializer): + default_platform = PlatformSerializer(nested=True, required=False, allow_null=True) + + # Counter fields + virtual_machine_count = serializers.IntegerField(read_only=True) + + class Meta: + model = VirtualMachineType + fields = [ + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'default_platform', 'default_vcpus', + 'default_memory', 'description', 'owner', 'comments', 'tags', + 'custom_fields', 'created', 'last_updated', 'virtual_machine_count', + ] + brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description') + + class VirtualMachineSerializer(PrimaryModelSerializer): + virtual_machine_type = VirtualMachineTypeSerializer(nested=True, required=False, allow_null=True, default=None) status = ChoiceField(choices=VirtualMachineStatusChoices, required=False) start_on_boot = ChoiceField(choices=VirtualMachineStartOnBootChoices, required=False) site = SiteSerializer(nested=True, required=False, allow_null=True, default=None) @@ -52,10 +70,10 @@ class VirtualMachineSerializer(PrimaryModelSerializer): class Meta: model = VirtualMachine fields = [ - 'id', 'url', 'display_url', 'display', 'name', 'status', 'start_on_boot', 'site', 'cluster', 'device', - 'serial', 'role', 'tenant', 'platform', 'primary_ip', 'primary_ip4', 'primary_ip6', 'vcpus', 'memory', - 'disk', 'description', 'owner', 'comments', 'config_template', 'local_context_data', 'tags', - 'custom_fields', 'created', 'last_updated', 'interface_count', 'virtual_disk_count', + 'id', 'url', 'display_url', 'display', 'name', 'virtual_machine_type', 'role', 'status', 'start_on_boot', + 'site', 'cluster', 'device', 'platform', 'primary_ip', 'primary_ip4', 'primary_ip6', 'vcpus', 'memory', + 'disk', 'description', 'serial', 'tenant', 'owner', 'comments', 'tags', 'local_context_data', + 'config_template', 'custom_fields', 'created', 'last_updated', 'interface_count', 'virtual_disk_count', ] brief_fields = ('id', 'url', 'display', 'name', 'description') @@ -65,10 +83,11 @@ class VirtualMachineWithConfigContextSerializer(VirtualMachineSerializer): class Meta(VirtualMachineSerializer.Meta): fields = [ - 'id', 'url', 'display_url', 'display', 'name', 'status', 'start_on_boot', 'site', 'cluster', 'device', - 'serial', 'role', 'tenant', 'platform', 'primary_ip', 'primary_ip4', 'primary_ip6', 'vcpus', 'memory', - 'disk', 'description', 'owner', 'comments', 'config_template', 'local_context_data', 'tags', - 'custom_fields', 'config_context', 'created', 'last_updated', 'interface_count', 'virtual_disk_count', + 'id', 'url', 'display_url', 'display', 'name', 'virtual_machine_type', 'role', 'status', 'start_on_boot', + 'site', 'cluster', 'device', 'platform', 'primary_ip', 'primary_ip4', 'primary_ip6', 'vcpus', 'memory', + 'disk', 'description', 'serial', 'tenant', 'owner', 'comments', 'tags', 'local_context_data', + 'config_template', 'custom_fields', 'created', 'last_updated', 'interface_count', 'virtual_disk_count', + 'config_context', ] @extend_schema_field(serializers.JSONField(allow_null=True)) diff --git a/netbox/virtualization/api/urls.py b/netbox/virtualization/api/urls.py index 013f8b78e..4df0299c9 100644 --- a/netbox/virtualization/api/urls.py +++ b/netbox/virtualization/api/urls.py @@ -10,6 +10,9 @@ router.register('cluster-types', views.ClusterTypeViewSet) router.register('cluster-groups', views.ClusterGroupViewSet) router.register('clusters', views.ClusterViewSet) +# Virtual machine types +router.register('virtual-machine-types', views.VirtualMachineTypeViewSet) + # VirtualMachines router.register('virtual-machines', views.VirtualMachineViewSet) router.register('interfaces', views.VMInterfaceViewSet) diff --git a/netbox/virtualization/api/views.py b/netbox/virtualization/api/views.py index 4fe0e9ca7..d1f06762a 100644 --- a/netbox/virtualization/api/views.py +++ b/netbox/virtualization/api/views.py @@ -14,6 +14,7 @@ class VirtualizationRootView(APIRootView): """ Virtualization API root view """ + def get_view_name(self): return 'Virtualization' @@ -22,6 +23,7 @@ class VirtualizationRootView(APIRootView): # Clusters # + class ClusterTypeViewSet(NetBoxModelViewSet): queryset = ClusterType.objects.all() serializer_class = serializers.ClusterTypeSerializer @@ -44,10 +46,22 @@ class ClusterViewSet(NetBoxModelViewSet): filterset_class = filtersets.ClusterFilterSet +# +# Virtual machine types +# + + +class VirtualMachineTypeViewSet(NetBoxModelViewSet): + queryset = VirtualMachineType.objects.all() + serializer_class = serializers.VirtualMachineTypeSerializer + filterset_class = filtersets.VirtualMachineTypeFilterSet + + # # Virtual machines # + class VirtualMachineViewSet(ConfigContextQuerySetMixin, RenderConfigMixin, NetBoxModelViewSet): queryset = VirtualMachine.objects.all() filterset_class = filtersets.VirtualMachineFilterSet diff --git a/netbox/virtualization/apps.py b/netbox/virtualization/apps.py index d337e0219..81811aca9 100644 --- a/netbox/virtualization/apps.py +++ b/netbox/virtualization/apps.py @@ -9,10 +9,10 @@ class VirtualizationConfig(AppConfig): from utilities.counters import connect_counters from . import search, signals # noqa: F401 - from .models import VirtualMachine + from .models import VirtualMachine, VirtualMachineType # Register models register_models(*self.get_models()) # Register counters - connect_counters(VirtualMachine) + connect_counters(VirtualMachine, VirtualMachineType) diff --git a/netbox/virtualization/filtersets.py b/netbox/virtualization/filtersets.py index 56449f641..ea12eccd1 100644 --- a/netbox/virtualization/filtersets.py +++ b/netbox/virtualization/filtersets.py @@ -26,6 +26,7 @@ __all__ = ( 'VMInterfaceFilterSet', 'VirtualDiskFilterSet', 'VirtualMachineFilterSet', + 'VirtualMachineTypeFilterSet', ) @@ -91,6 +92,45 @@ class ClusterFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ScopedFilterSet, ) +@register_filterset +class VirtualMachineTypeFilterSet(PrimaryModelFilterSet): + default_platform_id = TreeNodeMultipleChoiceFilter( + queryset=Platform.objects.all(), + field_name='default_platform', + lookup_expr='in', + label=_('Default platform (ID)'), + ) + default_platform = TreeNodeMultipleChoiceFilter( + queryset=Platform.objects.all(), + field_name='default_platform', + to_field_name='slug', + lookup_expr='in', + label=_('Default platform (slug)'), + ) + + class Meta: + model = VirtualMachineType + fields = ( + 'id', + 'name', + 'slug', + 'default_vcpus', + 'default_memory', + 'description', + 'virtual_machine_count', + ) + + def search(self, queryset, name, value): + if not value.strip(): + return queryset + + return queryset.filter( + Q(name__icontains=value) | + Q(description__icontains=value) | + Q(comments__icontains=value) + ) + + @register_filterset class VirtualMachineFilterSet( PrimaryModelFilterSet, @@ -99,6 +139,18 @@ class VirtualMachineFilterSet( LocalConfigContextFilterSet, PrimaryIPFilterSet, ): + virtual_machine_type_id = django_filters.ModelMultipleChoiceFilter( + queryset=VirtualMachineType.objects.all(), + distinct=False, + label=_('Virtual machine type (ID)'), + ) + virtual_machine_type = django_filters.ModelMultipleChoiceFilter( + field_name='virtual_machine_type__slug', + queryset=VirtualMachineType.objects.all(), + distinct=False, + to_field_name='slug', + label=_('Virtual machine type (slug)'), + ) status = django_filters.MultipleChoiceFilter( choices=VirtualMachineStatusChoices, distinct=False, diff --git a/netbox/virtualization/forms/bulk_edit.py b/netbox/virtualization/forms/bulk_edit.py index beab54093..5b7ca78c7 100644 --- a/netbox/virtualization/forms/bulk_edit.py +++ b/netbox/virtualization/forms/bulk_edit.py @@ -14,8 +14,9 @@ from utilities.forms import BulkRenameForm, add_blank_choice from utilities.forms.fields import DynamicModelChoiceField, DynamicModelMultipleChoiceField from utilities.forms.rendering import FieldSet from utilities.forms.widgets import BulkEditNullBooleanSelect -from virtualization.choices import * -from virtualization.models import * + +from ..choices import * +from ..models import * __all__ = ( 'ClusterBulkEditForm', @@ -26,6 +27,7 @@ __all__ = ( 'VirtualDiskBulkEditForm', 'VirtualDiskBulkRenameForm', 'VirtualMachineBulkEditForm', + 'VirtualMachineTypeBulkEditForm', ) @@ -78,7 +80,37 @@ class ClusterBulkEditForm(ScopedBulkEditForm, PrimaryModelBulkEditForm): ) +class VirtualMachineTypeBulkEditForm(PrimaryModelBulkEditForm): + default_platform = DynamicModelChoiceField( + label=_('Default platform'), + queryset=Platform.objects.all(), + required=False + ) + default_vcpus = forms.IntegerField( + label=_('Default vCPUs'), + required=False, + ) + default_memory = forms.IntegerField( + label=_('Default Memory (MB)'), + required=False, + ) + + model = VirtualMachineType + fieldsets = ( + FieldSet('description', name=_('Virtual Machine Type')), + FieldSet('default_platform', 'default_vcpus', 'default_memory', name=_('Defaults')), + ) + nullable_fields = ( + 'default_platform', 'default_vcpus', 'default_memory', 'description', 'comments', + ) + + class VirtualMachineBulkEditForm(PrimaryModelBulkEditForm): + virtual_machine_type = DynamicModelChoiceField( + label=_('Virtual machine type'), + queryset=VirtualMachineType.objects.all(), + required=False + ) status = forms.ChoiceField( label=_('Status'), choices=add_blank_choice(VirtualMachineStatusChoices), @@ -152,13 +184,14 @@ class VirtualMachineBulkEditForm(PrimaryModelBulkEditForm): model = VirtualMachine fieldsets = ( - FieldSet('status', 'start_on_boot', 'role', 'tenant', 'platform', 'description'), + FieldSet('virtual_machine_type', 'status', 'start_on_boot', 'role', 'tenant', 'platform', 'description'), FieldSet('site', 'cluster', 'device', name=_('Placement')), FieldSet('vcpus', 'memory', 'disk', name=_('Resources')), FieldSet('config_template', name=_('Configuration')), ) nullable_fields = ( - 'site', 'cluster', 'device', 'role', 'tenant', 'platform', 'vcpus', 'memory', 'disk', 'description', 'comments', + 'virtual_machine_type', 'role', 'site', 'cluster', 'device', 'platform', 'vcpus', 'memory', 'disk', 'tenant', + 'description', 'comments', ) diff --git a/netbox/virtualization/forms/bulk_import.py b/netbox/virtualization/forms/bulk_import.py index 0e0b0ab88..14061dd8a 100644 --- a/netbox/virtualization/forms/bulk_import.py +++ b/netbox/virtualization/forms/bulk_import.py @@ -10,8 +10,9 @@ from ipam.models import VLAN, VRF, VLANGroup from netbox.forms import NetBoxModelImportForm, OrganizationalModelImportForm, OwnerCSVMixin, PrimaryModelImportForm from tenancy.models import Tenant from utilities.forms.fields import CSVChoiceField, CSVModelChoiceField, CSVModelMultipleChoiceField -from virtualization.choices import * -from virtualization.models import * + +from ..choices import * +from ..models import * __all__ = ( 'ClusterGroupImportForm', @@ -20,6 +21,7 @@ __all__ = ( 'VMInterfaceImportForm', 'VirtualDiskImportForm', 'VirtualMachineImportForm', + 'VirtualMachineTypeImportForm', ) @@ -82,7 +84,31 @@ class ClusterImportForm(ScopedImportForm, PrimaryModelImportForm): } +class VirtualMachineTypeImportForm(PrimaryModelImportForm): + default_platform = CSVModelChoiceField( + label=_('Default platform'), + queryset=Platform.objects.all(), + required=False, + to_field_name='name', + help_text=_('Assigned default platform'), + ) + + class Meta: + model = VirtualMachineType + fields = ( + 'name', 'slug', 'default_platform', 'default_vcpus', 'default_memory', 'description', + 'owner', 'comments', 'tags', + ) + + class VirtualMachineImportForm(PrimaryModelImportForm): + virtual_machine_type = CSVModelChoiceField( + label=_('Virtual machine type'), + queryset=VirtualMachineType.objects.all(), + to_field_name='name', + required=False, + help_text=_('Optional virtual machine type'), + ) status = CSVChoiceField( label=_('Status'), choices=VirtualMachineStatusChoices, @@ -149,8 +175,9 @@ class VirtualMachineImportForm(PrimaryModelImportForm): class Meta: model = VirtualMachine fields = ( - 'name', 'status', 'start_on_boot', 'role', 'site', 'cluster', 'device', 'tenant', 'platform', 'vcpus', - 'memory', 'disk', 'description', 'serial', 'config_template', 'comments', 'owner', 'tags', + 'name', 'virtual_machine_type', 'role', 'status', 'start_on_boot', 'site', 'cluster', 'device', + 'platform', 'vcpus', 'memory', 'disk', 'description', 'serial', + 'tenant', 'owner', 'comments', 'tags', 'config_template', ) diff --git a/netbox/virtualization/forms/filtersets.py b/netbox/virtualization/forms/filtersets.py index 5b1b44cb6..4ba14080a 100644 --- a/netbox/virtualization/forms/filtersets.py +++ b/netbox/virtualization/forms/filtersets.py @@ -12,10 +12,11 @@ from tenancy.forms import ContactModelFilterForm, TenancyFilterForm from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES from utilities.forms.fields import DynamicModelMultipleChoiceField, TagFilterField from utilities.forms.rendering import FieldSet -from virtualization.choices import * -from virtualization.models import * from vpn.models import L2VPN +from ..choices import * +from ..models import * + __all__ = ( 'ClusterFilterForm', 'ClusterGroupFilterForm', @@ -23,6 +24,7 @@ __all__ = ( 'VMInterfaceFilterForm', 'VirtualDiskFilterForm', 'VirtualMachineFilterForm', + 'VirtualMachineTypeFilterForm', ) @@ -100,6 +102,43 @@ class ClusterFilterForm(TenancyFilterForm, ContactModelFilterForm, PrimaryModelF tag = TagFilterField(model) +class VirtualMachineTypeFilterForm(PrimaryModelFilterSetForm): + model = VirtualMachineType + + fieldsets = ( + FieldSet('q', 'filter_id', 'tag'), + FieldSet( + 'default_platform_id', 'default_vcpus', 'default_memory', 'virtual_machine_count', + name=_('Attributes'), + ), + FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), + ) + + selector_fields = ('filter_id', 'q') + + default_platform_id = DynamicModelMultipleChoiceField( + queryset=Platform.objects.all(), + required=False, + label=_('Default platform'), + ) + default_vcpus = forms.DecimalField( + label=_('Default vCPUs'), + required=False, + ) + default_memory = forms.IntegerField( + label=_('Default memory (MB)'), + required=False, + min_value=0, + ) + virtual_machine_count = forms.IntegerField( + label=_('Virtual machine count'), + required=False, + min_value=0, + ) + + tag = TagFilterField(model) + + class VirtualMachineFilterForm( LocalConfigContextFilterForm, TenancyFilterForm, @@ -112,13 +151,20 @@ class VirtualMachineFilterForm( FieldSet('cluster_group_id', 'cluster_type_id', 'cluster_id', 'device_id', name=_('Cluster')), FieldSet('region_id', 'site_group_id', 'site_id', name=_('Location')), FieldSet( - 'status', 'start_on_boot', 'role_id', 'platform_id', 'mac_address', 'has_primary_ip', 'config_template_id', - 'local_context_data', 'serial', name=_('Attributes') + 'virtual_machine_type_id', 'status', 'start_on_boot', 'role_id', 'platform_id', 'mac_address', + 'has_primary_ip', 'config_template_id', 'local_context_data', 'serial', + name=_('Attributes') ), FieldSet('tenant_group_id', 'tenant_id', name=_('Tenant')), FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), FieldSet('contact', 'contact_role', 'contact_group', name=_('Contacts')), ) + virtual_machine_type_id = DynamicModelMultipleChoiceField( + queryset=VirtualMachineType.objects.all(), + required=False, + null_option='None', + label=_('Virtual machine type'), + ) cluster_group_id = DynamicModelMultipleChoiceField( queryset=ClusterGroup.objects.all(), required=False, diff --git a/netbox/virtualization/forms/model_forms.py b/netbox/virtualization/forms/model_forms.py index 28e59bdd1..a29cbcc5e 100644 --- a/netbox/virtualization/forms/model_forms.py +++ b/netbox/virtualization/forms/model_forms.py @@ -13,11 +13,12 @@ from ipam.models import VLAN, VRF, IPAddress, VLANGroup, VLANTranslationPolicy from netbox.forms import NetBoxModelForm, OrganizationalModelForm, PrimaryModelForm from netbox.forms.mixins import OwnerMixin from tenancy.forms import TenancyForm -from utilities.forms import ConfirmationForm -from utilities.forms.fields import DynamicModelChoiceField, DynamicModelMultipleChoiceField, JSONField +from utilities.forms import ConfirmationForm, get_field_value +from utilities.forms.fields import DynamicModelChoiceField, DynamicModelMultipleChoiceField, JSONField, SlugField from utilities.forms.rendering import FieldSet from utilities.forms.widgets import HTMXSelect -from virtualization.models import * + +from ..models import * __all__ = ( 'ClusterAddDevicesForm', @@ -28,6 +29,7 @@ __all__ = ( 'VMInterfaceForm', 'VirtualDiskForm', 'VirtualMachineForm', + 'VirtualMachineTypeForm', ) @@ -167,7 +169,35 @@ class ClusterRemoveDevicesForm(ConfirmationForm): ) +class VirtualMachineTypeForm(PrimaryModelForm): + slug = SlugField() + default_platform = DynamicModelChoiceField( + label=_('Default platform'), + queryset=Platform.objects.all(), + required=False, + selector=True, + ) + + fieldsets = ( + FieldSet('name', 'slug', 'description', 'tags', name=_('Virtual Machine Type')), + FieldSet('default_platform', 'default_vcpus', 'default_memory', name=_('Defaults')), + ) + + class Meta: + model = VirtualMachineType + fields = ( + 'name', 'slug', 'default_platform', 'default_vcpus', 'default_memory', 'description', + 'owner', 'comments', 'tags', + ) + + class VirtualMachineForm(TenancyForm, PrimaryModelForm): + virtual_machine_type = forms.ModelChoiceField( + label=_('Type'), + queryset=VirtualMachineType.objects.all(), + required=False, + widget=HTMXSelect(), + ) site = DynamicModelChoiceField( label=_('Site'), queryset=Site.objects.all(), @@ -226,7 +256,10 @@ class VirtualMachineForm(TenancyForm, PrimaryModelForm): ) fieldsets = ( - FieldSet('name', 'role', 'status', 'start_on_boot', 'description', 'serial', 'tags', name=_('Virtual Machine')), + FieldSet( + 'name', 'virtual_machine_type', 'role', 'status', 'start_on_boot', 'description', 'serial', 'tags', + name=_('Virtual Machine') + ), FieldSet('site', 'cluster', 'device', name=_('Placement')), FieldSet('tenant_group', 'tenant', name=_('Tenancy')), FieldSet('platform', 'primary_ip4', 'primary_ip6', 'config_template', name=_('Management')), @@ -237,14 +270,17 @@ class VirtualMachineForm(TenancyForm, PrimaryModelForm): class Meta: model = VirtualMachine fields = [ - 'name', 'status', 'start_on_boot', 'site', 'cluster', 'device', 'role', 'tenant_group', 'tenant', - 'platform', 'primary_ip4', 'primary_ip6', 'vcpus', 'memory', 'disk', 'description', 'serial', 'owner', - 'comments', 'tags', 'local_context_data', 'config_template', + 'name', 'virtual_machine_type', 'role', 'status', 'start_on_boot', 'site', 'cluster', 'device', + 'platform', 'primary_ip4', 'primary_ip6', 'vcpus', 'memory', 'disk', 'description', 'serial', + 'tenant_group', 'tenant', 'owner', 'comments', 'tags', 'local_context_data', 'config_template', ] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) + # Populate virtual machine type defaults, if any + self._populate_virtual_machine_type_defaults() + if self.instance.pk: # Disable the disk field if one or more VirtualDisks have been created @@ -285,6 +321,36 @@ class VirtualMachineForm(TenancyForm, PrimaryModelForm): self.fields.pop('primary_ip4') self.fields.pop('primary_ip6') + def _populate_virtual_machine_type_defaults(self): + """ + Populate platform/vCPUs/memory from the selected VirtualMachineType. + + For new VMs, always apply defaults. For existing VMs, only apply + defaults when the type changes and the field is currently empty. + """ + if not (virtual_machine_type_id := get_field_value(self, 'virtual_machine_type')): + return + + is_new = not self.instance.pk + + # Skip if editing and the type hasn't changed + if not is_new and int(virtual_machine_type_id) == self.instance.virtual_machine_type_id: + return + + if not (virtual_machine_type := VirtualMachineType.objects.filter(pk=virtual_machine_type_id).first()): + return + + defaults = { + 'platform': ('default_platform_id', 'platform_id'), + 'vcpus': ('default_vcpus', 'vcpus'), + 'memory': ('default_memory', 'memory'), + } + + for field_name, (type_attr, instance_attr) in defaults.items(): + default_value = getattr(virtual_machine_type, type_attr) + if default_value is not None and (is_new or getattr(self.instance, instance_attr) is None): + self.initial[field_name] = default_value + # # Virtual machine components diff --git a/netbox/virtualization/graphql/filters.py b/netbox/virtualization/graphql/filters.py index eb750cec8..4605c4424 100644 --- a/netbox/virtualization/graphql/filters.py +++ b/netbox/virtualization/graphql/filters.py @@ -3,7 +3,7 @@ from typing import TYPE_CHECKING, Annotated import strawberry import strawberry_django from strawberry.scalars import ID -from strawberry_django import BaseFilterLookup, FilterLookup, StrFilterLookup +from strawberry_django import BaseFilterLookup, ComparisonFilterLookup, FilterLookup, StrFilterLookup from dcim.graphql.filter_mixins import InterfaceBaseFilterMixin, RenderConfigFilterMixin, ScopedFilterMixin from extras.graphql.filter_mixins import ConfigContextFilterMixin @@ -34,6 +34,7 @@ __all__ = ( 'VMInterfaceFilter', 'VirtualDiskFilter', 'VirtualMachineFilter', + 'VirtualMachineTypeFilter', ) @@ -68,6 +69,24 @@ class ClusterTypeFilter(OrganizationalModelFilter): pass +@strawberry_django.filter_type(models.VirtualMachineType, lookups=True) +class VirtualMachineTypeFilter(ImageAttachmentFilterMixin, PrimaryModelFilter): + default_platform: Annotated['PlatformFilter', strawberry.lazy('dcim.graphql.filters')] | None = ( + strawberry_django.filter_field() + ) + default_platform_id: ID | None = strawberry_django.filter_field() + default_vcpus: Annotated['FloatLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = ( + strawberry_django.filter_field() + ) + default_memory: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = ( + strawberry_django.filter_field() + ) + instances: Annotated['VirtualMachineFilter', strawberry.lazy('virtualization.graphql.filters')] | None = ( + strawberry_django.filter_field() + ) + virtual_machine_count: ComparisonFilterLookup[int] | None = strawberry_django.filter_field() + + @strawberry_django.filter_type(models.VirtualMachine, lookups=True) class VirtualMachineFilter( ContactFilterMixin, @@ -78,6 +97,9 @@ class VirtualMachineFilter( PrimaryModelFilter, ): name: StrFilterLookup[str] | None = strawberry_django.filter_field() + virtual_machine_type: ( + Annotated['VirtualMachineTypeFilter', strawberry.lazy('virtualization.graphql.filters')] | None + ) = strawberry_django.filter_field() site: Annotated['SiteFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field() site_id: ID | None = strawberry_django.filter_field() cluster: Annotated['ClusterFilter', strawberry.lazy('virtualization.graphql.filters')] | None = ( diff --git a/netbox/virtualization/graphql/schema.py b/netbox/virtualization/graphql/schema.py index f0dee3815..7ea7a2b49 100644 --- a/netbox/virtualization/graphql/schema.py +++ b/netbox/virtualization/graphql/schema.py @@ -4,7 +4,7 @@ import strawberry_django from .types import * -@strawberry.type(name="Query") +@strawberry.type(name='Query') class VirtualizationQuery: cluster: ClusterType = strawberry_django.field() cluster_list: list[ClusterType] = strawberry_django.field() @@ -15,6 +15,9 @@ class VirtualizationQuery: cluster_type: ClusterTypeType = strawberry_django.field() cluster_type_list: list[ClusterTypeType] = strawberry_django.field() + virtual_machine_type: VirtualMachineTypeType = strawberry_django.field() + virtual_machine_type_list: list[VirtualMachineTypeType] = strawberry_django.field() + virtual_machine: VirtualMachineType = strawberry_django.field() virtual_machine_list: list[VirtualMachineType] = strawberry_django.field() diff --git a/netbox/virtualization/graphql/types.py b/netbox/virtualization/graphql/types.py index 68a6e19ac..96563aac8 100644 --- a/netbox/virtualization/graphql/types.py +++ b/netbox/virtualization/graphql/types.py @@ -34,6 +34,7 @@ __all__ = ( 'VMInterfaceType', 'VirtualDiskType', 'VirtualMachineType', + 'VirtualMachineTypeType', ) @@ -91,6 +92,19 @@ class ClusterTypeType(OrganizationalObjectType): clusters: list[ClusterType] +@strawberry_django.type( + models.VirtualMachineType, + fields='__all__', + filters=VirtualMachineTypeFilter, + pagination=True +) +class VirtualMachineTypeType(PrimaryObjectType): + virtual_machine_count: BigInt + default_platform: Annotated['PlatformType', strawberry.lazy('dcim.graphql.types')] | None + + instances: list[Annotated['VirtualMachineType', strawberry.lazy('virtualization.graphql.types')]] + + @strawberry_django.type( models.VirtualMachine, fields='__all__', @@ -101,6 +115,7 @@ class VirtualMachineType(ConfigContextMixin, ContactsMixin, PrimaryObjectType): interface_count: BigInt virtual_disk_count: BigInt interface_count: BigInt + virtual_machine_type: Annotated['VirtualMachineTypeType', strawberry.lazy('virtualization.graphql.types')] | None config_template: Annotated["ConfigTemplateType", strawberry.lazy('extras.graphql.types')] | None site: Annotated["SiteType", strawberry.lazy('dcim.graphql.types')] | None cluster: Annotated["ClusterType", strawberry.lazy('virtualization.graphql.types')] | None diff --git a/netbox/virtualization/migrations/0054_virtualmachinetype.py b/netbox/virtualization/migrations/0054_virtualmachinetype.py new file mode 100644 index 000000000..1a68b6229 --- /dev/null +++ b/netbox/virtualization/migrations/0054_virtualmachinetype.py @@ -0,0 +1,106 @@ +from decimal import Decimal + +import django.core.validators +import django.db.models.deletion +import django.db.models.functions.text +import taggit.managers +from django.db import migrations, models + +import netbox.models.deletion +import utilities.fields +import utilities.json + + +class Migration(migrations.Migration): + dependencies = [ + ('virtualization', '0053_virtualmachine_standalone_device_assignment'), + ] + + operations = [ + migrations.CreateModel( + name='VirtualMachineType', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True, null=True)), + ('last_updated', models.DateTimeField(auto_now=True, null=True)), + ( + 'custom_field_data', + models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder), + ), + ('description', models.CharField(blank=True, max_length=200)), + ('comments', models.TextField(blank=True)), + ('name', models.CharField(max_length=100)), + ('slug', models.SlugField(max_length=100)), + ( + 'default_vcpus', + models.DecimalField( + blank=True, + decimal_places=2, + max_digits=6, + null=True, + validators=[django.core.validators.MinValueValidator(Decimal('0.01'))], + ), + ), + ('default_memory', models.PositiveIntegerField(blank=True, null=True)), + ( + 'virtual_machine_count', + utilities.fields.CounterCacheField( + default=0, + editable=False, + to_field='virtual_machine_type', + to_model='virtualization.VirtualMachine', + ), + ), + ( + 'default_platform', + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name='+', + to='dcim.platform', + ), + ), + ( + 'owner', + models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='users.owner' + ), + ), + ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), + ], + options={ + 'verbose_name': 'virtual machine type', + 'verbose_name_plural': 'virtual machine types', + 'ordering': ('name',), + }, + bases=(netbox.models.deletion.DeleteMixin, models.Model), + ), + migrations.AddField( + model_name='virtualmachine', + name='virtual_machine_type', + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name='instances', + to='virtualization.virtualmachinetype', + ), + ), + migrations.AddConstraint( + model_name='virtualmachinetype', + constraint=models.UniqueConstraint( + django.db.models.functions.text.Lower('name'), + name='virtualization_virtualmachinetype_unique_name', + violation_error_message='Virtual machine type name must be unique.', + ), + ), + migrations.AddConstraint( + model_name='virtualmachinetype', + constraint=models.UniqueConstraint( + fields=('slug',), + name='virtualization_virtualmachinetype_unique_slug', + violation_error_message='Virtual machine type slug must be unique.', + ), + ), + ] diff --git a/netbox/virtualization/models/virtualmachines.py b/netbox/virtualization/models/virtualmachines.py index b8b82ffc7..8314c8904 100644 --- a/netbox/virtualization/models/virtualmachines.py +++ b/netbox/virtualization/models/virtualmachines.py @@ -20,16 +20,88 @@ from utilities.fields import CounterCacheField, NaturalOrderingField from utilities.ordering import naturalize_interface from utilities.query_functions import CollateAsChar from utilities.tracking import TrackingModelMixin -from virtualization.choices import * + +from ..choices import * __all__ = ( 'VMInterface', 'VirtualDisk', 'VirtualMachine', + 'VirtualMachineType', ) -class VirtualMachine(ContactsMixin, ImageAttachmentsMixin, RenderConfigMixin, ConfigContextModel, PrimaryModel): +class VirtualMachineType(ImageAttachmentsMixin, PrimaryModel): + """ + A type defining default attributes (platform, vCPUs, memory, etc.) for virtual machines. + """ + + name = models.CharField( + verbose_name=_('name'), + max_length=100, + ) + slug = models.SlugField( + verbose_name=_('slug'), + max_length=100, + ) + default_platform = models.ForeignKey( + to='dcim.Platform', + on_delete=models.SET_NULL, + related_name='+', + blank=True, + null=True, + verbose_name=_('default platform'), + ) + default_vcpus = models.DecimalField( + verbose_name=_('default vCPUs'), + max_digits=6, + decimal_places=2, + blank=True, + null=True, + validators=(MinValueValidator(decimal.Decimal('0.01')),), + ) + default_memory = models.PositiveIntegerField( + verbose_name=_('default memory (MB)'), + blank=True, + null=True, + ) + + # Counter fields + virtual_machine_count = CounterCacheField( + to_model='virtualization.VirtualMachine', + to_field='virtual_machine_type', + ) + + clone_fields = ( + 'default_platform', + 'default_vcpus', + 'default_memory', + ) + + class Meta: + ordering = ('name',) + constraints = ( + models.UniqueConstraint( + Lower('name'), + name='%(app_label)s_%(class)s_unique_name', + violation_error_message=_('Virtual machine type name must be unique.'), + ), + models.UniqueConstraint( + fields=('slug',), + name='%(app_label)s_%(class)s_unique_slug', + violation_error_message=_('Virtual machine type slug must be unique.'), + ), + ) + verbose_name = _('virtual machine type') + verbose_name_plural = _('virtual machine types') + + def __str__(self): + return self.name + + +class VirtualMachine( + ContactsMixin, ImageAttachmentsMixin, RenderConfigMixin, ConfigContextModel, TrackingModelMixin, PrimaryModel +): """ A virtual machine which runs on a Cluster or a standalone Device. @@ -42,6 +114,15 @@ class VirtualMachine(ContactsMixin, ImageAttachmentsMixin, RenderConfigMixin, Co When a Cluster or Device is set, the Site is automatically inherited if not explicitly provided. If a Device belongs to a Cluster, the Cluster must also be specified on the VM. """ + + virtual_machine_type = models.ForeignKey( + to='virtualization.VirtualMachineType', + on_delete=models.PROTECT, + related_name='instances', + verbose_name=_('type'), + blank=True, + null=True, + ) site = models.ForeignKey( to='dcim.Site', on_delete=models.PROTECT, @@ -162,7 +243,8 @@ class VirtualMachine(ContactsMixin, ImageAttachmentsMixin, RenderConfigMixin, Co objects = ConfigContextModelQuerySet.as_manager() clone_fields = ( - 'site', 'cluster', 'device', 'tenant', 'platform', 'status', 'role', 'vcpus', 'memory', 'disk', + 'virtual_machine_type', 'site', 'cluster', 'device', 'tenant', 'platform', 'status', 'role', 'vcpus', 'memory', + 'disk', ) class Meta: @@ -282,8 +364,29 @@ class VirtualMachine(ContactsMixin, ImageAttachmentsMixin, RenderConfigMixin, Co elif self.device and self.device.site: self.site = self.device.site + if self._state.adding: + self.apply_type_defaults() + super().save(*args, **kwargs) + def apply_type_defaults(self): + """ + Populate any empty fields with defaults from the assigned VirtualMachineType. + """ + if not self.virtual_machine_type_id: + return + + defaults = { + 'platform_id': 'default_platform_id', + 'vcpus': 'default_vcpus', + 'memory': 'default_memory', + } + for field, default_field in defaults.items(): + if getattr(self, field) is None: + default_value = getattr(self.virtual_machine_type, default_field) + if default_value is not None: + setattr(self, field, default_value) + def get_status_color(self): return VirtualMachineStatusChoices.colors.get(self.status) diff --git a/netbox/virtualization/search.py b/netbox/virtualization/search.py index 65f4928b5..e75ea4899 100644 --- a/netbox/virtualization/search.py +++ b/netbox/virtualization/search.py @@ -38,6 +38,18 @@ class ClusterTypeIndex(SearchIndex): display_attrs = ('description',) +@register_search +class VirtualMachineTypeIndex(SearchIndex): + model = models.VirtualMachineType + fields = ( + ('name', 100), + ('slug', 110), + ('description', 500), + ('comments', 5000), + ) + display_attrs = ('default_platform', 'default_vcpus', 'default_memory', 'description') + + @register_search class VirtualMachineIndex(SearchIndex): model = models.VirtualMachine diff --git a/netbox/virtualization/tables/virtualmachines.py b/netbox/virtualization/tables/virtualmachines.py index d218392c4..298ad6277 100644 --- a/netbox/virtualization/tables/virtualmachines.py +++ b/netbox/virtualization/tables/virtualmachines.py @@ -5,28 +5,64 @@ from dcim.tables.devices import BaseInterfaceTable from netbox.tables import NetBoxTable, PrimaryModelTable, columns from tenancy.tables import ContactsColumnMixin, TenancyColumnsMixin from utilities.templatetags.helpers import humanize_disk_megabytes -from virtualization.models import VirtualDisk, VirtualMachine, VMInterface +from ..models import VirtualDisk, VirtualMachine, VirtualMachineType, VMInterface from .template_code import * __all__ = ( 'VMInterfaceTable', 'VirtualDiskTable', 'VirtualMachineTable', + 'VirtualMachineTypeTable', 'VirtualMachineVMInterfaceTable', 'VirtualMachineVirtualDiskTable', ) +# +# Virtual machine types +# + + +class VirtualMachineTypeTable(PrimaryModelTable): + name = tables.Column( + verbose_name=_('Name'), + linkify=True, + ) + default_platform = tables.Column( + verbose_name=_('Default platform'), + linkify=True, + ) + virtual_machine_count = tables.Column( + verbose_name=_('VM count') + ) + tags = columns.TagColumn( + url_name='virtualization:virtualmachinetype_list' + ) + + class Meta(PrimaryModelTable.Meta): + model = VirtualMachineType + fields = ( + 'pk', 'id', 'name', 'slug', 'default_platform', 'default_vcpus', 'default_memory', 'virtual_machine_count', + 'description', 'comments', 'tags', 'created', 'last_updated', + ) + default_columns = ( + 'pk', 'name', 'default_platform', 'default_vcpus', 'default_memory', 'virtual_machine_count', 'description', + ) # # Virtual machines # + class VirtualMachineTable(TenancyColumnsMixin, ContactsColumnMixin, PrimaryModelTable): name = tables.Column( verbose_name=_('Name'), linkify=True ) + virtual_machine_type = tables.Column( + verbose_name=_('Type'), + linkify=True, + ) status = columns.ChoiceFieldColumn( verbose_name=_('Status'), ) @@ -85,12 +121,13 @@ class VirtualMachineTable(TenancyColumnsMixin, ContactsColumnMixin, PrimaryModel class Meta(PrimaryModelTable.Meta): model = VirtualMachine fields = ( - 'pk', 'id', 'name', 'status', 'start_on_boot', 'site', 'cluster', 'device', 'role', 'tenant', - 'tenant_group', 'vcpus', 'memory', 'disk', 'primary_ip4', 'primary_ip6', 'primary_ip', 'description', - 'comments', 'config_template', 'serial', 'contacts', 'tags', 'created', 'last_updated', + 'pk', 'id', 'name', 'virtual_machine_type', 'role', 'status', 'start_on_boot', 'site', 'cluster', 'device', + 'platform', 'primary_ip4', 'primary_ip6', 'primary_ip', 'vcpus', 'memory', 'disk', 'description', 'serial', + 'tenant_group', 'tenant', 'contacts', 'comments', 'tags', 'config_template', 'created', 'last_updated', ) default_columns = ( - 'pk', 'name', 'status', 'site', 'cluster', 'role', 'tenant', 'vcpus', 'memory', 'disk', 'primary_ip', + 'pk', 'name', 'virtual_machine_type', 'role', 'status', 'site', 'cluster', 'tenant', + 'vcpus', 'memory', 'disk', 'primary_ip', ) def render_disk(self, value): diff --git a/netbox/virtualization/tests/test_api.py b/netbox/virtualization/tests/test_api.py index 453298025..e7137d27e 100644 --- a/netbox/virtualization/tests/test_api.py +++ b/netbox/virtualization/tests/test_api.py @@ -7,7 +7,7 @@ from rest_framework import status from core.models import ObjectType from dcim.choices import InterfaceModeChoices -from dcim.models import Site +from dcim.models import Platform, Site from extras.choices import CustomFieldTypeChoices from extras.models import ConfigTemplate, CustomField from ipam.choices import VLANQinQRoleChoices @@ -167,54 +167,153 @@ class ClusterTest(APIViewTestCases.APIViewTestCase): ] +class VirtualMachineTypeTest(APIViewTestCases.APIViewTestCase): + model = VirtualMachineType + brief_fields = ['description', 'display', 'id', 'name', 'slug', 'url'] + user_permissions = ('dcim.view_platform', 'virtualization.view_virtualmachine') + + @classmethod + def setUpTestData(cls): + cls.platforms = ( + Platform.objects.create(name='Platform 1', slug='platform-1'), + Platform.objects.create(name='Platform 2', slug='platform-2'), + Platform.objects.create(name='Platform 3', slug='platform-3'), + ) + + cls.virtual_machine_types = ( + VirtualMachineType.objects.create( + name='Virtual Machine Type 1', + slug='virtual-machine-type-1', + default_platform=cls.platforms[0], + default_vcpus=1, + default_memory=1024, + ), + VirtualMachineType.objects.create( + name='Virtual Machine Type 2', + slug='virtual-machine-type-2', + default_platform=cls.platforms[1], + default_vcpus=2, + default_memory=2048, + ), + VirtualMachineType.objects.create( + name='Virtual Machine Type 3', + slug='virtual-machine-type-3', + default_platform=cls.platforms[2], + default_vcpus=4, + default_memory=4096, + ), + ) + + cls.create_data = [ + { + 'name': 'Virtual Machine Type 4', + 'slug': 'virtual-machine-type-4', + 'default_platform': cls.platforms[0].pk, + 'default_vcpus': 1, + 'default_memory': 1024, + }, + { + 'name': 'Virtual Machine Type 5', + 'slug': 'virtual-machine-type-5', + 'default_platform': cls.platforms[1].pk, + 'default_vcpus': 2, + 'default_memory': 2048, + }, + { + 'name': 'Virtual Machine Type 6', + 'slug': 'virtual-machine-type-6', + 'default_platform': cls.platforms[2].pk, + 'default_vcpus': 4, + 'default_memory': 4096, + }, + ] + + cls.bulk_update_data = { + 'default_platform': cls.platforms[2].pk, + 'default_vcpus': 8, + 'default_memory': 8192, + 'description': 'New description', + } + + class VirtualMachineTest(APIViewTestCases.APIViewTestCase): model = VirtualMachine brief_fields = ['description', 'display', 'id', 'name', 'url'] bulk_update_data = { 'status': 'staged', } + user_permissions = ('dcim.view_platform', 'virtualization.view_virtualmachinetype') @classmethod def setUpTestData(cls): clustertype = ClusterType.objects.create(name='Cluster Type 1', slug='cluster-type-1') clustergroup = ClusterGroup.objects.create(name='Cluster Group 1', slug='cluster-group-1') - sites = ( + cls.sites = ( Site(name='Site 1', slug='site-1'), Site(name='Site 2', slug='site-2'), Site(name='Site 3', slug='site-3'), ) - Site.objects.bulk_create(sites) + Site.objects.bulk_create(cls.sites) - clusters = ( - Cluster(name='Cluster 1', type=clustertype, scope=sites[0], group=clustergroup), - Cluster(name='Cluster 2', type=clustertype, scope=sites[1], group=clustergroup), + cls.clusters = ( + Cluster(name='Cluster 1', type=clustertype, scope=cls.sites[0], group=clustergroup), + Cluster(name='Cluster 2', type=clustertype, scope=cls.sites[1], group=clustergroup), Cluster(name='Cluster 3', type=clustertype), ) - for cluster in clusters: + for cluster in cls.clusters: cluster.save() - device1 = create_test_device('device1', site=sites[0], cluster=clusters[0]) - device2 = create_test_device('device2', site=sites[1], cluster=clusters[1]) + cls.devices = ( + create_test_device('device1', site=cls.sites[0], cluster=cls.clusters[0]), + create_test_device('device2', site=cls.sites[1], cluster=cls.clusters[1]), + ) + + cls.platforms = ( + Platform.objects.create(name='Platform 1', slug='platform-1'), + Platform.objects.create(name='Platform 2', slug='platform-2'), + Platform.objects.create(name='Platform 3', slug='platform-3'), + ) + + cls.vm_types = ( + VirtualMachineType.objects.create( + name='Virtual Machine Type 1', + slug='virtual-machine-type-1', + default_platform=cls.platforms[0], + default_vcpus=2, + default_memory=4096, + ), + VirtualMachineType.objects.create( + name='Virtual Machine Type 2', + slug='virtual-machine-type-2', + default_platform=cls.platforms[1], + default_vcpus=4, + default_memory=8192, + ), + ) virtual_machines = ( VirtualMachine( name='Virtual Machine 1', - site=sites[0], - cluster=clusters[0], - device=device1, + virtual_machine_type=cls.vm_types[0], + site=cls.sites[0], + cluster=cls.clusters[0], + device=cls.devices[0], + platform=cls.platforms[0], + vcpus=2, + memory=4096, local_context_data={'A': 1}, ), VirtualMachine( name='Virtual Machine 2', - site=sites[0], - cluster=clusters[0], - local_context_data={'B': 2 - }), + site=cls.sites[0], + cluster=cls.clusters[0], + local_context_data={'B': 2}, + ), VirtualMachine( name='Virtual Machine 3', - site=sites[0], - cluster=clusters[0], + site=cls.sites[0], + cluster=cls.clusters[0], local_context_data={'C': 3}, start_on_boot=VirtualMachineStartOnBootChoices.STATUS_ON, ), @@ -224,26 +323,89 @@ class VirtualMachineTest(APIViewTestCases.APIViewTestCase): cls.create_data = [ { 'name': 'Virtual Machine 4', - 'site': sites[1].pk, - 'cluster': clusters[1].pk, - 'device': device2.pk, + 'site': cls.sites[1].pk, + 'cluster': cls.clusters[1].pk, + 'device': cls.devices[1].pk, + 'virtual_machine_type': cls.vm_types[0].pk, }, { 'name': 'Virtual Machine 5', - 'site': sites[1].pk, - 'cluster': clusters[1].pk, + 'site': cls.sites[1].pk, + 'cluster': cls.clusters[1].pk, + 'virtual_machine_type': cls.vm_types[1].pk, }, { 'name': 'Virtual Machine 6', - 'site': sites[1].pk, + 'site': cls.sites[1].pk, }, { 'name': 'Virtual Machine 7', - 'cluster': clusters[2].pk, + 'cluster': cls.clusters[2].pk, + 'virtual_machine_type': cls.vm_types[0].pk, 'start_on_boot': VirtualMachineStartOnBootChoices.STATUS_ON, }, ] + def test_virtual_machine_type_defaults_applied_on_create(self): + data = { + 'name': 'Virtual Machine With Defaults', + 'site': self.sites[1].pk, + 'cluster': self.clusters[1].pk, + 'virtual_machine_type': self.vm_types[0].pk, + 'platform': None, + 'vcpus': None, + 'memory': None, + } + self.add_permissions('virtualization.add_virtualmachine') + + response = self.client.post(self._get_list_url(), data, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_201_CREATED) + + vm = VirtualMachine.objects.get(pk=response.data['id']) + self.assertEqual(vm.virtual_machine_type, self.vm_types[0]) + self.assertEqual(vm.platform, self.vm_types[0].default_platform) + self.assertEqual(vm.vcpus, self.vm_types[0].default_vcpus) + self.assertEqual(vm.memory, self.vm_types[0].default_memory) + + def test_virtual_machine_type_defaults_do_not_override_explicit_values(self): + data = { + 'name': 'Virtual Machine With Explicit Values', + 'site': self.sites[1].pk, + 'cluster': self.clusters[1].pk, + 'virtual_machine_type': self.vm_types[0].pk, + 'platform': self.platforms[2].pk, + 'vcpus': 6, + 'memory': 12288, + } + self.add_permissions('virtualization.add_virtualmachine') + + response = self.client.post(self._get_list_url(), data, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_201_CREATED) + + vm = VirtualMachine.objects.get(pk=response.data['id']) + self.assertEqual(vm.virtual_machine_type, self.vm_types[0]) + self.assertEqual(vm.platform, self.platforms[2]) + self.assertEqual(vm.vcpus, 6) + self.assertEqual(vm.memory, 12288) + + def test_setting_virtual_machine_type_on_existing_vm_does_not_backfill_defaults(self): + vm = VirtualMachine.objects.get(name='Virtual Machine 2') + self.add_permissions('virtualization.change_virtualmachine') + + response = self.client.patch( + self._get_detail_url(vm), + {'virtual_machine_type': self.vm_types[1].pk}, + format='json', + **self.header, + ) + self.assertHttpStatus(response, status.HTTP_200_OK) + + vm.refresh_from_db() + self.assertEqual(vm.virtual_machine_type, self.vm_types[1]) + self.assertIsNone(vm.platform) + self.assertIsNone(vm.vcpus) + self.assertIsNone(vm.memory) + def test_config_context_included_by_default_in_list_view(self): """ Check that config context data is included by default in the virtual machines list. diff --git a/netbox/virtualization/tests/test_filtersets.py b/netbox/virtualization/tests/test_filtersets.py index d9e96d940..dae270eff 100644 --- a/netbox/virtualization/tests/test_filtersets.py +++ b/netbox/virtualization/tests/test_filtersets.py @@ -230,6 +230,116 @@ class ClusterTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) +class VirtualMachineTypeTestCase(TestCase, ChangeLoggedFilterSetTests): + queryset = VirtualMachineType.objects.all() + filterset = VirtualMachineTypeFilterSet + + @classmethod + def setUpTestData(cls): + + platforms = ( + Platform(name='Platform 1', slug='platform-1'), + Platform(name='Platform 2', slug='platform-2'), + Platform(name='Platform 3', slug='platform-3'), + ) + for platform in platforms: + platform.save() + + cluster_type = ClusterType.objects.create( + name='Cluster Type 1', + slug='cluster-type-1', + ) + site = Site.objects.create( + name='Site 1', + slug='site-1', + ) + cluster = Cluster.objects.create( + name='Cluster 1', + type=cluster_type, + scope=site, + ) + + cls.vm_types = ( + VirtualMachineType.objects.create( + name='Virtual Machine Type 1', + slug='virtual-machine-type-1', + default_platform=platforms[0], + default_vcpus=1, + default_memory=1024, + description='foobar1', + ), + VirtualMachineType.objects.create( + name='Virtual Machine Type 2', + slug='virtual-machine-type-2', + default_platform=platforms[1], + default_vcpus=2, + default_memory=2048, + description='foobar2', + ), + VirtualMachineType.objects.create( + name='Virtual Machine Type 3', + slug='virtual-machine-type-3', + default_platform=platforms[2], + default_vcpus=4, + default_memory=4096, + description='foobar3', + ), + ) + + # Populate virtual_machine_count + VirtualMachine.objects.create( + name='vm-type-1a', + cluster=cluster, + virtual_machine_type=cls.vm_types[0], + ) + VirtualMachine.objects.create( + name='vm-type-1b', + cluster=cluster, + virtual_machine_type=cls.vm_types[0], + tenant=Tenant.objects.create(name='Tenant 1', slug='tenant-1'), + ) + VirtualMachine.objects.create( + name='vm-type-2a', + cluster=cluster, + virtual_machine_type=cls.vm_types[1], + ) + + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + + def test_name(self): + params = {'name': ['Virtual Machine Type 1', 'Virtual Machine Type 2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_slug(self): + params = {'slug': ['virtual-machine-type-1', 'virtual-machine-type-2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_default_platform(self): + platforms = Platform.objects.all()[:2] + params = {'default_platform_id': [platforms[0].pk, platforms[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'default_platform': [platforms[0].slug, platforms[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_default_vcpus(self): + params = {'default_vcpus': [1, 2]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_default_memory(self): + params = {'default_memory': [1024, 2048]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_virtual_machine_count(self): + params = {'virtual_machine_count': [1, 2]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + class VirtualMachineTestCase(TestCase, ChangeLoggedFilterSetTests): queryset = VirtualMachine.objects.all() filterset = VirtualMachineFilterSet @@ -290,6 +400,30 @@ class VirtualMachineTestCase(TestCase, ChangeLoggedFilterSetTests): for platform in platforms: platform.save() + cls.vm_types = ( + VirtualMachineType.objects.create( + name='Virtual Machine Type 1', + slug='virtual-machine-type-1', + default_platform=platforms[0], + default_vcpus=1, + default_memory=1024, + ), + VirtualMachineType.objects.create( + name='Virtual Machine Type 2', + slug='virtual-machine-type-2', + default_platform=platforms[1], + default_vcpus=2, + default_memory=2048, + ), + VirtualMachineType.objects.create( + name='Virtual Machine Type 3', + slug='virtual-machine-type-3', + default_platform=platforms[2], + default_vcpus=4, + default_memory=4096, + ), + ) + roles = ( DeviceRole(name='Device Role 1', slug='device-role-1'), DeviceRole(name='Device Role 2', slug='device-role-2'), @@ -322,6 +456,7 @@ class VirtualMachineTestCase(TestCase, ChangeLoggedFilterSetTests): vms = ( VirtualMachine( name='Virtual Machine 1', + virtual_machine_type=cls.vm_types[0], site=sites[0], cluster=clusters[0], device=devices[0], @@ -333,11 +468,12 @@ class VirtualMachineTestCase(TestCase, ChangeLoggedFilterSetTests): memory=1, disk=1, description='foobar1', - local_context_data={"foo": 123}, - serial='111-aaa' + local_context_data={'foo': 123}, + serial='111-aaa', ), VirtualMachine( name='Virtual Machine 2', + virtual_machine_type=cls.vm_types[1], site=sites[1], cluster=clusters[1], device=devices[1], @@ -354,6 +490,7 @@ class VirtualMachineTestCase(TestCase, ChangeLoggedFilterSetTests): ), VirtualMachine( name='Virtual Machine 3', + virtual_machine_type=cls.vm_types[2], site=sites[2], cluster=clusters[2], device=devices[2], @@ -499,6 +636,13 @@ class VirtualMachineTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'platform': [platforms[0].slug, platforms[1].slug]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_virtual_machine_type(self): + vm_types = VirtualMachineType.objects.all()[:2] + params = {'virtual_machine_type_id': [vm_types[0].pk, vm_types[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'virtual_machine_type': [vm_types[0].slug, vm_types[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_mac_address(self): params = {'mac_address': ['00-00-00-00-00-01', '00-00-00-00-00-02']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) diff --git a/netbox/virtualization/tests/test_models.py b/netbox/virtualization/tests/test_models.py index 0f64e102a..1497135c0 100644 --- a/netbox/virtualization/tests/test_models.py +++ b/netbox/virtualization/tests/test_models.py @@ -1,12 +1,106 @@ +from decimal import Decimal + from django.core.exceptions import ValidationError from django.test import TestCase -from dcim.models import Site +from dcim.models import Platform, Site from tenancy.models import Tenant from utilities.testing import create_test_device from virtualization.models import * +class VirtualMachineTypeTestCase(TestCase): + + @classmethod + def setUpTestData(cls): + cls.platform = Platform.objects.create( + name='Type Test Ubuntu 24.04', + slug='type-test-ubuntu-24-04', + ) + cls.virtual_machine_type = VirtualMachineType.objects.create( + name='Small Linux', + slug='small-linux', + default_platform=cls.platform, + default_vcpus=Decimal('2.00'), + default_memory=4096, + ) + + cls.cluster_type = ClusterType.objects.create( + name='VM Type Count Cluster Type', + slug='vm-type-count-cluster-type', + ) + cls.site = Site.objects.create( + name='VM Type Count Site', + slug='vm-type-count-site', + ) + cls.cluster = Cluster.objects.create( + name='VM Type Count Cluster', + type=cls.cluster_type, + scope=cls.site, + ) + + def test_virtual_machine_type_str_and_defaults(self): + """ + Verify that the string representation of a VirtualMachineType returns + its name, and that all default fields (platform, vcpus, memory) are + stored correctly after creation. + """ + self.assertEqual(str(self.virtual_machine_type), 'Small Linux') + self.assertEqual(self.virtual_machine_type.default_platform, self.platform) + self.assertEqual(self.virtual_machine_type.default_vcpus, Decimal('2.00')) + self.assertEqual(self.virtual_machine_type.default_memory, 4096) + + def test_virtual_machine_type_virtual_machine_count(self): + """ + The virtual_machine_count counter cache field should accurately track + the number of VirtualMachines referencing this type through creation, + additional insertions, reassignment, and deletion. + """ + # Starts at zero + self.assertEqual(self.virtual_machine_type.virtual_machine_count, 0) + + # Create the first VM + vm1 = VirtualMachine.objects.create( + name='vm-count-test-1', + cluster=self.cluster, + virtual_machine_type=self.virtual_machine_type, + ) + self.virtual_machine_type.refresh_from_db() + self.assertEqual(self.virtual_machine_type.virtual_machine_count, 1) + + # Create the second VM + vm2 = VirtualMachine.objects.create( + name='vm-count-test-2', + cluster=self.cluster, + virtual_machine_type=self.virtual_machine_type, + ) + self.virtual_machine_type.refresh_from_db() + self.assertEqual(self.virtual_machine_type.virtual_machine_count, 2) + + # Delete one VM — count should decrement + vm1.delete() + self.virtual_machine_type.refresh_from_db() + self.assertEqual(self.virtual_machine_type.virtual_machine_count, 1) + + # Reassign the remaining VM to no type — count should drop to zero + vm2.virtual_machine_type = None + vm2.save() + self.virtual_machine_type.refresh_from_db() + self.assertEqual(self.virtual_machine_type.virtual_machine_count, 0) + + def test_virtual_machine_type_invalid_default_vcpus(self): + """ + default_vcpus below the minimum should fail validation. + """ + vmt = VirtualMachineType( + name='Zero vCPU Type', + slug='zero-vcpu-type', + default_vcpus=Decimal('0.00'), + ) + with self.assertRaises(ValidationError): + vmt.full_clean() + + class VirtualMachineTestCase(TestCase): @classmethod @@ -14,6 +108,12 @@ class VirtualMachineTestCase(TestCase): # Create the cluster type cls.cluster_type = ClusterType.objects.create(name='Cluster Type 1', slug='cluster-type-1') + # Create platforms + cls.platforms = ( + Platform.objects.create(name='VM Default Ubuntu 24.04', slug='vm-default-ubuntu-24-04'), + Platform.objects.create(name='VM Default Debian 12', slug='vm-default-debian-12'), + ) + # Create sites cls.sites = ( Site.objects.create(name='Site 1', slug='site-1'), @@ -59,6 +159,24 @@ class VirtualMachineTestCase(TestCase): Tenant.objects.create(name='Tenant 2', slug='tenant-2'), ) + # Create virtual machine types + cls.vm_types = ( + VirtualMachineType.objects.create( + name='General Purpose Small', + slug='general-purpose-small', + default_platform=cls.platforms[0], + default_vcpus=Decimal('2.00'), + default_memory=4096, + ), + VirtualMachineType.objects.create( + name='General Purpose Large', + slug='general-purpose-large', + default_platform=cls.platforms[1], + default_vcpus=Decimal('8.00'), + default_memory=16384, + ), + ) + def test_vm_duplicate_name_per_cluster(self): """ Test that creating two Virtual Machines with the same name in @@ -157,6 +275,181 @@ class VirtualMachineTestCase(TestCase): with self.assertRaises(ValidationError): vm.full_clean() + # + # Virtual Machine Type tests + # + + def test_vm_type_defaults_applied_on_create(self): + """ + When a new VirtualMachine is created with a VirtualMachineType and no + explicit platform, vcpus, or memory, the type's defaults should be + automatically applied via apply_type_defaults(). + """ + vm = VirtualMachine( + name='vm-type-defaults', + cluster=self.cluster_with_site, + virtual_machine_type=self.vm_types[0], + ) + vm.full_clean() + vm.save() + vm.refresh_from_db() + + self.assertEqual(vm.platform, self.platforms[0]) + self.assertEqual(vm.vcpus, Decimal('2.00')) + self.assertEqual(vm.memory, 4096) + + def test_vm_type_defaults_do_not_override_explicit_values(self): + """ + When a new VirtualMachine specifies explicit values for a platform, + vcpus, and memory, those values must be preserved even if the + assigned VirtualMachineType defines different defaults. + """ + vm = VirtualMachine( + name='vm-type-explicit', + cluster=self.cluster_with_site, + virtual_machine_type=self.vm_types[0], + platform=self.platforms[1], + vcpus=Decimal('4.00'), + memory=8192, + ) + vm.full_clean() + vm.save() + vm.refresh_from_db() + + self.assertEqual(vm.platform, self.platforms[1]) + self.assertEqual(vm.vcpus, Decimal('4.00')) + self.assertEqual(vm.memory, 8192) + + def test_vm_type_added_to_existing_vm_does_not_backfill_defaults(self): + """ + Assigning a VirtualMachineType to an already-saved VirtualMachine + (i.e. an update, not a creation) must not retroactively populate + the VM's fields with the type's defaults, since apply_type_defaults() + only runs on initial creation. + """ + vm = VirtualMachine( + name='vm-type-added-later', + cluster=self.cluster_with_site, + ) + vm.full_clean() + vm.save() + + vm.virtual_machine_type = self.vm_types[0] + vm.full_clean() + vm.save() + vm.refresh_from_db() + + self.assertEqual(vm.virtual_machine_type, self.vm_types[0]) + self.assertIsNone(vm.platform) + self.assertIsNone(vm.vcpus) + self.assertIsNone(vm.memory) + + def test_vm_type_change_does_not_overwrite_existing_values(self): + """ + Changing the VirtualMachineType on an existing VirtualMachine must + not overwrite field values that were previously set — either + explicitly or via earlier type defaults. + """ + vm = VirtualMachine( + name='vm-type-change', + cluster=self.cluster_with_site, + virtual_machine_type=self.vm_types[0], + ) + vm.full_clean() + vm.save() + vm.refresh_from_db() + + self.assertEqual(vm.platform, self.platforms[0]) + self.assertEqual(vm.vcpus, Decimal('2.00')) + self.assertEqual(vm.memory, 4096) + + vm.platform = self.platforms[1] + vm.vcpus = Decimal('6.00') + vm.memory = 12288 + vm.virtual_machine_type = self.vm_types[1] + vm.full_clean() + vm.save() + vm.refresh_from_db() + + self.assertEqual(vm.platform, self.platforms[1]) + self.assertEqual(vm.vcpus, Decimal('6.00')) + self.assertEqual(vm.memory, 12288) + self.assertEqual(vm.virtual_machine_type, self.vm_types[1]) + + def test_vm_type_partial_defaults(self): + """ + A VirtualMachineType with only some defaults set should only populate + those fields on a new VM, leaving the rest as None. + """ + partial_type = VirtualMachineType.objects.create( + name='Partial Defaults', + slug='partial-defaults', + default_vcpus=Decimal('4.00'), + # default_platform and default_memory intentionally left None + ) + + vm = VirtualMachine( + name='vm-partial-defaults', + cluster=self.cluster_with_site, + virtual_machine_type=partial_type, + ) + vm.full_clean() + vm.save() + vm.refresh_from_db() + + self.assertIsNone(vm.platform) + self.assertEqual(vm.vcpus, Decimal('4.00')) + self.assertIsNone(vm.memory) + + def test_vm_type_no_defaults(self): + """ + A VirtualMachineType with all default fields as None should not + alter any VM fields on creation. + """ + empty_type = VirtualMachineType.objects.create( + name='Empty Type', + slug='empty-type', + ) + + vm = VirtualMachine( + name='vm-empty-type', + cluster=self.cluster_with_site, + virtual_machine_type=empty_type, + ) + vm.full_clean() + vm.save() + vm.refresh_from_db() + + self.assertEqual(vm.virtual_machine_type, empty_type) + self.assertIsNone(vm.platform) + self.assertIsNone(vm.vcpus) + self.assertIsNone(vm.memory) + + def test_vm_created_without_type(self): + """ + A VM created without a VirtualMachineType should not raise any errors + in apply_type_defaults() and should leave all fields as None. + """ + vm = VirtualMachine( + name='vm-no-type', + cluster=self.cluster_with_site, + ) + vm.full_clean() + vm.save() + vm.refresh_from_db() + + self.assertIsNone(vm.virtual_machine_type) + self.assertIsNone(vm.platform) + self.assertIsNone(vm.vcpus) + self.assertIsNone(vm.memory) + + def test_vm_type_is_included_in_clone_fields(self): + """ + Verify that virtual_machine_type is part of clone_fields so it + carries over when cloning a VM. + """ + self.assertIn('virtual_machine_type', VirtualMachine.clone_fields) + # # Device assignment tests # diff --git a/netbox/virtualization/tests/test_views.py b/netbox/virtualization/tests/test_views.py index 12a4eca4b..dbd152637 100644 --- a/netbox/virtualization/tests/test_views.py +++ b/netbox/virtualization/tests/test_views.py @@ -1,3 +1,5 @@ +from decimal import Decimal + from django.contrib.contenttypes.models import ContentType from django.test import override_settings from django.urls import reverse @@ -202,6 +204,81 @@ class ClusterTestCase(ViewTestCases.PrimaryObjectViewTestCase): self.assertHttpStatus(self.client.get(url), 200) +class VirtualMachineTypeTestCase(ViewTestCases.PrimaryObjectViewTestCase): + model = VirtualMachineType + + @classmethod + def setUpTestData(cls): + + cls.platforms = ( + Platform(name='Platform 1', slug='platform-1'), + Platform(name='Platform 2', slug='platform-2'), + Platform(name='Platform 3', slug='platform-3'), + ) + for platform in cls.platforms: + platform.save() + + cls.virtual_machine_types = ( + VirtualMachineType( + name='Virtual Machine Type 1', + slug='virtual-machine-type-1', + default_platform=cls.platforms[0], + default_vcpus=Decimal('1.00'), + default_memory=1024, + ), + VirtualMachineType( + name='Virtual Machine Type 2', + slug='virtual-machine-type-2', + default_platform=cls.platforms[1], + default_vcpus=Decimal('2.00'), + default_memory=2048, + ), + VirtualMachineType( + name='Virtual Machine Type 3', + slug='virtual-machine-type-3', + default_platform=cls.platforms[2], + default_vcpus=Decimal('4.00'), + default_memory=4096, + ), + ) + for virtual_machine_type in cls.virtual_machine_types: + virtual_machine_type.save() + + tags = create_tags('Alpha', 'Bravo', 'Charlie') + + cls.form_data = { + 'name': 'Virtual Machine Type X', + 'slug': 'virtual-machine-type-x', + 'default_platform': cls.platforms[1].pk, + 'default_vcpus': 8, + 'default_memory': 8192, + 'description': 'A new virtual machine type', + 'comments': 'Some comments', + 'tags': [t.pk for t in tags], + } + + cls.csv_data = ( + 'name,slug,default_platform,default_vcpus,default_memory,description', + 'Virtual Machine Type 4,virtual-machine-type-4,Platform 1,1.00,1024,Fourth virtual machine type', + 'Virtual Machine Type 5,virtual-machine-type-5,Platform 2,2.00,2048,Fifth virtual machine type', + 'Virtual Machine Type 6,virtual-machine-type-6,Platform 3,4.00,4096,Sixth virtual machine type', + ) + + cls.csv_update_data = ( + 'id,name,description', + f'{cls.virtual_machine_types[0].pk},Virtual Machine Type 7,New description 7', + f'{cls.virtual_machine_types[1].pk},Virtual Machine Type 8,New description 8', + f'{cls.virtual_machine_types[2].pk},Virtual Machine Type 9,New description 9', + ) + + cls.bulk_edit_data = { + 'default_platform': cls.platforms[2].pk, + 'default_vcpus': 16, + 'default_memory': 16384, + 'description': 'New description', + } + + class VirtualMachineTestCase(ViewTestCases.PrimaryObjectViewTestCase): model = VirtualMachine @@ -215,57 +292,79 @@ class VirtualMachineTestCase(ViewTestCases.PrimaryObjectViewTestCase): for role in roles: role.save() - platforms = ( + cls.platforms = ( Platform(name='Platform 1', slug='platform-1'), Platform(name='Platform 2', slug='platform-2'), ) - for platform in platforms: + for platform in cls.platforms: platform.save() - sites = ( + cls.sites = ( Site(name='Site 1', slug='site-1'), Site(name='Site 2', slug='site-2'), ) - Site.objects.bulk_create(sites) + Site.objects.bulk_create(cls.sites) clustertype = ClusterType.objects.create(name='Cluster Type 1', slug='cluster-type-1') - clusters = ( - Cluster(name='Cluster 1', type=clustertype, scope=sites[0]), - Cluster(name='Cluster 2', type=clustertype, scope=sites[1]), + cls.clusters = ( + Cluster(name='Cluster 1', type=clustertype, scope=cls.sites[0]), + Cluster(name='Cluster 2', type=clustertype, scope=cls.sites[1]), ) - for cluster in clusters: + for cluster in cls.clusters: cluster.save() - devices = ( - create_test_device('device1', site=sites[0], cluster=clusters[0]), - create_test_device('device2', site=sites[1], cluster=clusters[1]), + cls.devices = ( + create_test_device('device1', site=cls.sites[0], cluster=cls.clusters[0]), + create_test_device('device2', site=cls.sites[1], cluster=cls.clusters[1]), ) + cls.vm_types = ( + VirtualMachineType( + name='Virtual Machine Type 1', + slug='virtual-machine-type-1', + default_platform=cls.platforms[0], + default_vcpus=Decimal('2.00'), + default_memory=4096, + ), + VirtualMachineType( + name='Virtual Machine Type 2', + slug='virtual-machine-type-2', + default_platform=cls.platforms[1], + default_vcpus=Decimal('4.00'), + default_memory=8192, + ), + ) + for vm_type in cls.vm_types: + vm_type.save() + virtual_machines = ( VirtualMachine( name='Virtual Machine 1', - site=sites[0], - cluster=clusters[0], - device=devices[0], + virtual_machine_type=cls.vm_types[0], + site=cls.sites[0], + cluster=cls.clusters[0], + device=cls.devices[0], role=roles[0], - platform=platforms[0], + platform=cls.platforms[0], ), VirtualMachine( name='Virtual Machine 2', - site=sites[0], - cluster=clusters[0], - device=devices[0], + virtual_machine_type=cls.vm_types[0], + site=cls.sites[0], + cluster=cls.clusters[0], + device=cls.devices[0], role=roles[0], - platform=platforms[0], + platform=cls.platforms[0], ), VirtualMachine( name='Virtual Machine 3', - site=sites[0], - cluster=clusters[0], - device=devices[0], + virtual_machine_type=cls.vm_types[1], + site=cls.sites[0], + cluster=cls.clusters[0], + device=cls.devices[0], role=roles[0], - platform=platforms[0], + platform=cls.platforms[0], ), ) VirtualMachine.objects.bulk_create(virtual_machines) @@ -273,11 +372,12 @@ class VirtualMachineTestCase(ViewTestCases.PrimaryObjectViewTestCase): tags = create_tags('Alpha', 'Bravo', 'Charlie') cls.form_data = { - 'cluster': clusters[1].pk, - 'device': devices[1].pk, - 'site': sites[1].pk, + 'virtual_machine_type': cls.vm_types[1].pk, + 'cluster': cls.clusters[1].pk, + 'device': cls.devices[1].pk, + 'site': cls.sites[1].pk, 'tenant': None, - 'platform': platforms[1].pk, + 'platform': cls.platforms[1].pk, 'name': 'Virtual Machine X', 'status': VirtualMachineStatusChoices.STATUS_STAGED, 'start_on_boot': VirtualMachineStartOnBootChoices.STATUS_ON, @@ -294,34 +394,61 @@ class VirtualMachineTestCase(ViewTestCases.PrimaryObjectViewTestCase): } cls.csv_data = ( - "name,status,site,cluster,device", - "Virtual Machine 4,active,Site 1,Cluster 1,device1", - "Virtual Machine 5,active,Site 1,Cluster 1,device1", - "Virtual Machine 6,active,Site 1,Cluster 1,", + 'name,status,site,cluster,device,virtual_machine_type', + 'Virtual Machine 4,active,Site 1,Cluster 1,device1,Virtual Machine Type 1', + 'Virtual Machine 5,active,Site 1,Cluster 1,device1,Virtual Machine Type 2', + 'Virtual Machine 6,active,Site 1,Cluster 1,,Virtual Machine Type 1', ) cls.csv_update_data = ( - "id,name,comments", - f"{virtual_machines[0].pk},Virtual Machine 7,New comments 7", - f"{virtual_machines[1].pk},Virtual Machine 8,New comments 8", - f"{virtual_machines[2].pk},Virtual Machine 9,New comments 9", + 'id,name,comments', + f'{virtual_machines[0].pk},Virtual Machine 7,New comments 7', + f'{virtual_machines[1].pk},Virtual Machine 8,New comments 8', + f'{virtual_machines[2].pk},Virtual Machine 9,New comments 9', ) cls.bulk_edit_data = { - 'site': sites[1].pk, - 'cluster': clusters[1].pk, - 'device': devices[1].pk, + 'virtual_machine_type': cls.vm_types[1].pk, + 'site': cls.sites[1].pk, + 'cluster': cls.clusters[1].pk, + 'device': cls.devices[1].pk, 'tenant': None, - 'platform': platforms[1].pk, + 'platform': cls.platforms[1].pk, 'status': VirtualMachineStatusChoices.STATUS_STAGED, 'role': roles[1].pk, - 'vcpus': 8, + 'vcpus': Decimal('8.00'), 'memory': 65535, 'disk': 8000, 'comments': 'New comments', 'start_on_boot': VirtualMachineStartOnBootChoices.STATUS_OFF, } + @override_settings(EXEMPT_VIEW_PERMISSIONS=['*'], EXEMPT_EXCLUDE_MODELS=[]) + def test_create_virtualmachine_with_type_defaults(self): + self.add_permissions('virtualization.add_virtualmachine') + + response = self.client.post( + self._get_url('add'), + data={ + 'name': 'Virtual Machine Defaults', + 'virtual_machine_type': self.vm_types[0].pk, + 'status': VirtualMachineStatusChoices.STATUS_ACTIVE, + 'start_on_boot': VirtualMachineStartOnBootChoices.STATUS_OFF, + 'site': self.sites[0].pk, + 'cluster': self.clusters[0].pk, + 'platform': '', + 'vcpus': '', + 'memory': '', + }, + ) + self.assertHttpStatus(response, 302) + + vm = VirtualMachine.objects.get(name='Virtual Machine Defaults') + self.assertEqual(vm.virtual_machine_type, self.vm_types[0]) + self.assertEqual(vm.platform, self.platforms[0]) + self.assertEqual(vm.vcpus, self.vm_types[0].default_vcpus) + self.assertEqual(vm.memory, self.vm_types[0].default_memory) + @override_settings(EXEMPT_VIEW_PERMISSIONS=['*']) def test_virtualmachine_interfaces(self): virtualmachine = VirtualMachine.objects.first() diff --git a/netbox/virtualization/ui/panels.py b/netbox/virtualization/ui/panels.py index 799499cdd..d4e2bd213 100644 --- a/netbox/virtualization/ui/panels.py +++ b/netbox/virtualization/ui/panels.py @@ -2,6 +2,10 @@ from django.utils.translation import gettext_lazy as _ from netbox.ui import attrs, panels +# +# Cluster +# + class ClusterPanel(panels.ObjectAttributesPanel): name = attrs.TextAttr('name') @@ -13,8 +17,27 @@ class ClusterPanel(panels.ObjectAttributesPanel): scope = attrs.GenericForeignKeyAttr('scope', linkify=True) +# +# Virtual machine types +# + + +class VirtualMachineTypePanel(panels.ObjectAttributesPanel): + name = attrs.TextAttr('name') + default_platform = attrs.RelatedObjectAttr('default_platform', linkify=True) + default_vcpus = attrs.TextAttr('default_vcpus', label=_('Default vCPUs')) + default_memory = attrs.TextAttr('default_memory', format_string=_('{} MB'), label=_('Default memory')) + description = attrs.TextAttr('description') + + +# +# Virtual machines +# + + class VirtualMachinePanel(panels.ObjectAttributesPanel): name = attrs.TextAttr('name') + virtual_machine_type = attrs.RelatedObjectAttr('virtual_machine_type', linkify=True, label=_('Type')) status = attrs.ChoiceAttr('status') start_on_boot = attrs.ChoiceAttr('start_on_boot') role = attrs.RelatedObjectAttr('role', linkify=True) @@ -44,6 +67,11 @@ class VirtualMachinePlacementPanel(panels.ObjectAttributesPanel): device = attrs.RelatedObjectAttr('device', linkify=True) +# +# Virtual disks +# + + class VirtualDiskPanel(panels.ObjectAttributesPanel): virtual_machine = attrs.RelatedObjectAttr('virtual_machine', linkify=True, label=_('Virtual Machine')) name = attrs.TextAttr('name') @@ -51,6 +79,11 @@ class VirtualDiskPanel(panels.ObjectAttributesPanel): description = attrs.TextAttr('description') +# +# VM interfaces +# + + class VMInterfacePanel(panels.ObjectAttributesPanel): virtual_machine = attrs.RelatedObjectAttr('virtual_machine', linkify=True, label=_('Virtual Machine')) name = attrs.TextAttr('name') diff --git a/netbox/virtualization/urls.py b/netbox/virtualization/urls.py index 725260529..26090a408 100644 --- a/netbox/virtualization/urls.py +++ b/netbox/virtualization/urls.py @@ -16,6 +16,9 @@ urlpatterns = [ path('clusters/', include(get_model_urls('virtualization', 'cluster', detail=False))), path('clusters//', include(get_model_urls('virtualization', 'cluster'))), + path('virtual-machine-types/', include(get_model_urls('virtualization', 'virtualmachinetype', detail=False))), + path('virtual-machine-types//', include(get_model_urls('virtualization', 'virtualmachinetype'))), + path('virtual-machines/', include(get_model_urls('virtualization', 'virtualmachine', detail=False))), path('virtual-machines//', include(get_model_urls('virtualization', 'virtualmachine'))), diff --git a/netbox/virtualization/views.py b/netbox/virtualization/views.py index c3dbd1589..27cd0cb98 100644 --- a/netbox/virtualization/views.py +++ b/netbox/virtualization/views.py @@ -387,6 +387,80 @@ class ClusterAddDevicesView(generic.ObjectEditView): }) +# +# Virtual machine types +# + + +@register_model_view(VirtualMachineType, 'list', path='', detail=False) +class VirtualMachineTypeListView(generic.ObjectListView): + queryset = VirtualMachineType.objects.all() + filterset = filtersets.VirtualMachineTypeFilterSet + filterset_form = forms.VirtualMachineTypeFilterForm + table = tables.VirtualMachineTypeTable + + +@register_model_view(VirtualMachineType) +class VirtualMachineTypeView(GetRelatedModelsMixin, generic.ObjectView): + queryset = VirtualMachineType.objects.all() + layout = layout.SimpleLayout( + left_panels=[ + panels.VirtualMachineTypePanel(), + TagsPanel(), + CommentsPanel(), + ], + right_panels=[ + RelatedObjectsPanel(), + CustomFieldsPanel(), + ImageAttachmentsPanel(), + ], + ) + + def get_extra_context(self, request, instance): + return { + 'related_models': self.get_related_models(request, instance), + } + + +@register_model_view(VirtualMachineType, 'add', detail=False) +@register_model_view(VirtualMachineType, 'edit') +class VirtualMachineTypeEditView(generic.ObjectEditView): + queryset = VirtualMachineType.objects.all() + form = forms.VirtualMachineTypeForm + + +@register_model_view(VirtualMachineType, 'delete') +class VirtualMachineTypeDeleteView(generic.ObjectDeleteView): + queryset = VirtualMachineType.objects.all() + + +@register_model_view(VirtualMachineType, 'bulk_import', path='import', detail=False) +class VirtualMachineTypeBulkImportView(generic.BulkImportView): + queryset = VirtualMachineType.objects.all() + model_form = forms.VirtualMachineTypeImportForm + + +@register_model_view(VirtualMachineType, 'bulk_edit', path='edit', detail=False) +class VirtualMachineTypeBulkEditView(generic.BulkEditView): + queryset = VirtualMachineType.objects.all() + filterset = filtersets.VirtualMachineTypeFilterSet + table = tables.VirtualMachineTypeTable + form = forms.VirtualMachineTypeBulkEditForm + + +@register_model_view(VirtualMachineType, 'bulk_rename', path='rename', detail=False) +class VirtualMachineTypeBulkRenameView(generic.BulkRenameView): + queryset = VirtualMachineType.objects.all() + filterset = filtersets.VirtualMachineTypeFilterSet + + +@register_model_view(VirtualMachineType, 'bulk_delete', path='delete', detail=False) +class VirtualMachineTypeBulkDeleteView(generic.BulkDeleteView): + queryset = VirtualMachineType.objects.all() + filterset = filtersets.VirtualMachineTypeFilterSet + table = tables.VirtualMachineTypeTable + + # # Virtual machines # From e5b9e5a27915bba63edfbdb774ed4407ef1b3f3e Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 31 Mar 2026 13:41:49 -0400 Subject: [PATCH 047/104] Closes #19025: Add schema validation for JSON custom fields (#21746) --- docs/customization/custom-fields.md | 1 + docs/models/extras/customfield.md | 4 + .../0206_load_module_type_profiles.py | 6 +- .../extras/api/serializers_/customfields.py | 4 +- netbox/extras/forms/bulk_edit.py | 13 +++- netbox/extras/forms/bulk_import.py | 3 +- netbox/extras/forms/model_forms.py | 15 ++++ .../0136_customfield_validation_schema.py | 24 ++++++ netbox/extras/models/customfields.py | 28 ++++++- netbox/extras/tables/tables.py | 6 +- netbox/extras/tests/test_customfields.py | 75 +++++++++++++++++++ netbox/extras/tests/test_filtersets.py | 2 +- netbox/utilities/jsonschema.py | 2 - 13 files changed, 171 insertions(+), 12 deletions(-) create mode 100644 netbox/extras/migrations/0136_customfield_validation_schema.py diff --git a/docs/customization/custom-fields.md b/docs/customization/custom-fields.md index 4658cc7e6..eae35f3d0 100644 --- a/docs/customization/custom-fields.md +++ b/docs/customization/custom-fields.md @@ -63,6 +63,7 @@ NetBox supports limited custom validation for custom field values. Following are * Text: Regular expression (optional) * Integer: Minimum and/or maximum value (optional) * Selection: Must exactly match one of the prescribed choices +* JSON: Must adhere to the defined validation schema (if any) ### Custom Selection Fields diff --git a/docs/models/extras/customfield.md b/docs/models/extras/customfield.md index a5d083492..615a314b8 100644 --- a/docs/models/extras/customfield.md +++ b/docs/models/extras/customfield.md @@ -118,3 +118,7 @@ For numeric custom fields only. The maximum valid value (optional). ### Validation Regex For string-based custom fields only. A regular expression used to validate the field's value (optional). + +### Validation Schema + +For JSON custom fields, users have the option of defining a [validation schema](https://json-schema.org). Any value applied to this custom field on a model will be validated against the provided schema, if any. diff --git a/netbox/dcim/migrations/0206_load_module_type_profiles.py b/netbox/dcim/migrations/0206_load_module_type_profiles.py index 87661a8ac..1b9873faf 100644 --- a/netbox/dcim/migrations/0206_load_module_type_profiles.py +++ b/netbox/dcim/migrations/0206_load_module_type_profiles.py @@ -22,17 +22,21 @@ def load_initial_data(apps, schema_editor): 'power_supply', 'expansion_card' ) + profile_objects = [] for name in initial_profiles: file_path = DATA_FILES_PATH / f'{name}.json' with file_path.open('r') as f: data = json.load(f) try: - ModuleTypeProfile.objects.using(db_alias).create(**data) + profile = ModuleTypeProfile(**data) + profile_objects.append(profile) except Exception as e: print(f"Error loading data from {file_path}") raise e + ModuleTypeProfile.objects.using(db_alias).bulk_create(profile_objects) + class Migration(migrations.Migration): diff --git a/netbox/extras/api/serializers_/customfields.py b/netbox/extras/api/serializers_/customfields.py index b12979439..37eaca4c8 100644 --- a/netbox/extras/api/serializers_/customfields.py +++ b/netbox/extras/api/serializers_/customfields.py @@ -65,8 +65,8 @@ class CustomFieldSerializer(OwnerMixin, ChangeLogMessageSerializer, ValidatedMod 'id', 'url', 'display_url', 'display', 'object_types', 'type', 'related_object_type', 'data_type', 'name', 'label', 'group_name', 'description', 'required', 'unique', 'search_weight', 'filter_logic', 'ui_visible', 'ui_editable', 'is_cloneable', 'default', 'related_object_filter', 'weight', - 'validation_minimum', 'validation_maximum', 'validation_regex', 'choice_set', 'owner', 'comments', - 'created', 'last_updated', + 'validation_minimum', 'validation_maximum', 'validation_regex', 'validation_schema', 'choice_set', + 'owner', 'comments', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') diff --git a/netbox/extras/forms/bulk_edit.py b/netbox/extras/forms/bulk_edit.py index de0f2bb27..9fecfdb7a 100644 --- a/netbox/extras/forms/bulk_edit.py +++ b/netbox/extras/forms/bulk_edit.py @@ -7,7 +7,7 @@ from netbox.events import get_event_type_choices from netbox.forms import NetBoxModelBulkEditForm, PrimaryModelBulkEditForm from netbox.forms.mixins import ChangelogMessageMixin, OwnerMixin from utilities.forms import BulkEditForm, add_blank_choice -from utilities.forms.fields import ColorField, CommentField, DynamicModelChoiceField +from utilities.forms.fields import ColorField, CommentField, DynamicModelChoiceField, JSONField from utilities.forms.rendering import FieldSet from utilities.forms.widgets import BulkEditNullBooleanSelect @@ -88,14 +88,21 @@ class CustomFieldBulkEditForm(ChangelogMessageMixin, OwnerMixin, BulkEditForm): label=_('Validation regex'), required=False ) + validation_schema = JSONField( + label=_('Validation schema'), + required=False + ) comments = CommentField() fieldsets = ( FieldSet('group_name', 'description', 'weight', 'required', 'unique', 'choice_set', name=_('Attributes')), FieldSet('ui_visible', 'ui_editable', 'is_cloneable', name=_('Behavior')), - FieldSet('validation_minimum', 'validation_maximum', 'validation_regex', name=_('Validation')), + FieldSet( + 'validation_minimum', 'validation_maximum', 'validation_regex', 'validation_schema', + name=_('Validation') + ), ) - nullable_fields = ('group_name', 'description', 'choice_set') + nullable_fields = ('group_name', 'description', 'choice_set', 'validation_schema') class CustomFieldChoiceSetBulkEditForm(ChangelogMessageMixin, OwnerMixin, BulkEditForm): diff --git a/netbox/extras/forms/bulk_import.py b/netbox/extras/forms/bulk_import.py index df329fbcb..2bdb4beb6 100644 --- a/netbox/extras/forms/bulk_import.py +++ b/netbox/extras/forms/bulk_import.py @@ -80,7 +80,8 @@ class CustomFieldImportForm(OwnerCSVMixin, CSVModelForm): fields = ( 'name', 'label', 'group_name', 'type', 'object_types', 'related_object_type', 'required', 'unique', 'description', 'search_weight', 'filter_logic', 'default', 'choice_set', 'weight', 'validation_minimum', - 'validation_maximum', 'validation_regex', 'ui_visible', 'ui_editable', 'is_cloneable', 'owner', 'comments', + 'validation_maximum', 'validation_regex', 'validation_schema', 'ui_visible', 'ui_editable', + 'is_cloneable', 'owner', 'comments', ) diff --git a/netbox/extras/forms/model_forms.py b/netbox/extras/forms/model_forms.py index d01e32691..d1c43d2b0 100644 --- a/netbox/extras/forms/model_forms.py +++ b/netbox/extras/forms/model_forms.py @@ -76,6 +76,11 @@ class CustomFieldForm(ChangelogMessageMixin, OwnerMixin, forms.ModelForm): choice_set = DynamicModelChoiceField( queryset=CustomFieldChoiceSet.objects.all() ) + validation_schema = JSONField( + label=_('Validation schema'), + required=False, + help_text=_('A JSON schema definition for validating the custom field value') + ) comments = CommentField() fieldsets = ( @@ -144,6 +149,16 @@ class CustomFieldForm(ChangelogMessageMixin, OwnerMixin, forms.ModelForm): del self.fields['validation_minimum'] del self.fields['validation_maximum'] + # Adjust for JSON fields + if field_type == CustomFieldTypeChoices.TYPE_JSON: + self.fieldsets = ( + self.fieldsets[0], + FieldSet('validation_schema', name=_('Validation')), + *self.fieldsets[1:] + ) + else: + del self.fields['validation_schema'] + # Adjust for object & multi-object fields if field_type in ( CustomFieldTypeChoices.TYPE_OBJECT, diff --git a/netbox/extras/migrations/0136_customfield_validation_schema.py b/netbox/extras/migrations/0136_customfield_validation_schema.py new file mode 100644 index 000000000..9b4913fdd --- /dev/null +++ b/netbox/extras/migrations/0136_customfield_validation_schema.py @@ -0,0 +1,24 @@ +from django.db import migrations, models + +import utilities.jsonschema + + +class Migration(migrations.Migration): + + dependencies = [ + ('extras', '0135_configtemplate_debug'), + ] + + operations = [ + migrations.AddField( + model_name='customfield', + name='validation_schema', + field=models.JSONField( + blank=True, + help_text='A JSON schema definition for validating the custom field value', + null=True, + validators=[utilities.jsonschema.validate_schema], + verbose_name='validation schema', + ), + ), + ] diff --git a/netbox/extras/models/customfields.py b/netbox/extras/models/customfields.py index c9cfc4105..848199c20 100644 --- a/netbox/extras/models/customfields.py +++ b/netbox/extras/models/customfields.py @@ -4,6 +4,7 @@ import re from datetime import date, datetime import django_filters +import jsonschema from django import forms from django.conf import settings from django.contrib.postgres.fields import ArrayField @@ -15,6 +16,7 @@ from django.urls import reverse from django.utils.html import escape from django.utils.safestring import mark_safe from django.utils.translation import gettext_lazy as _ +from jsonschema.exceptions import ValidationError as JSONValidationError from core.models import ObjectType from extras.choices import * @@ -40,6 +42,7 @@ from utilities.forms.fields import ( ) from utilities.forms.utils import add_blank_choice from utilities.forms.widgets import APISelect, APISelectMultiple, DatePicker, DateTimePicker +from utilities.jsonschema import validate_schema from utilities.querysets import RestrictedQuerySet from utilities.templatetags.builtins.filters import render_markdown from utilities.validators import validate_regex @@ -222,6 +225,13 @@ class CustomField(CloningMixin, ExportTemplatesMixin, OwnerMixin, ChangeLoggedMo 'example, ^[A-Z]{3}$ will limit values to exactly three uppercase letters.' ) ) + validation_schema = models.JSONField( + blank=True, + null=True, + validators=[validate_schema], + verbose_name=_('validation schema'), + help_text=_('A JSON schema definition for validating the custom field value') + ) choice_set = models.ForeignKey( to='CustomFieldChoiceSet', on_delete=models.PROTECT, @@ -259,7 +269,7 @@ class CustomField(CloningMixin, ExportTemplatesMixin, OwnerMixin, ChangeLoggedMo clone_fields = ( 'object_types', 'type', 'related_object_type', 'group_name', 'description', 'required', 'unique', 'search_weight', 'filter_logic', 'default', 'weight', 'validation_minimum', 'validation_maximum', - 'validation_regex', 'choice_set', 'ui_visible', 'ui_editable', 'is_cloneable', + 'validation_regex', 'validation_schema', 'choice_set', 'ui_visible', 'ui_editable', 'is_cloneable', ) class Meta: @@ -389,6 +399,12 @@ class CustomField(CloningMixin, ExportTemplatesMixin, OwnerMixin, ChangeLoggedMo 'validation_regex': _("Regular expression validation is supported only for text and URL fields") }) + # Schema validation can be set only for JSON fields + if self.validation_schema and self.type != CustomFieldTypeChoices.TYPE_JSON: + raise ValidationError({ + 'validation_schema': _("JSON schema validation is supported only for JSON fields") + }) + # Uniqueness can not be enforced for boolean fields if self.unique and self.type == CustomFieldTypeChoices.TYPE_BOOLEAN: raise ValidationError({ @@ -815,6 +831,16 @@ class CustomField(CloningMixin, ExportTemplatesMixin, OwnerMixin, ChangeLoggedMo if type(id) is not int: raise ValidationError(_("Found invalid object ID: {id}").format(id=id)) + # Validate JSON against schema (if defined) + elif self.type == CustomFieldTypeChoices.TYPE_JSON: + if self.validation_schema: + try: + jsonschema.validate(value, schema=self.validation_schema) + except JSONValidationError as e: + raise ValidationError( + _("Value does not conform to the assigned schema: {error}").format(error=e.message) + ) + elif self.required: raise ValidationError(_("Required field cannot be empty.")) diff --git a/netbox/extras/tables/tables.py b/netbox/extras/tables/tables.py index 3315e1252..fa58b04cc 100644 --- a/netbox/extras/tables/tables.py +++ b/netbox/extras/tables/tables.py @@ -121,6 +121,10 @@ class CustomFieldTable(NetBoxTable): validation_regex = tables.Column( verbose_name=_('Validation Regex'), ) + validation_schema = columns.BooleanColumn( + verbose_name=_('Validation Schema'), + false_mark=None, + ) owner = tables.Column( linkify=True, verbose_name=_('Owner') @@ -132,7 +136,7 @@ class CustomFieldTable(NetBoxTable): 'pk', 'id', 'name', 'object_types', 'label', 'type', 'related_object_type', 'group_name', 'required', 'unique', 'default', 'description', 'search_weight', 'filter_logic', 'ui_visible', 'ui_editable', 'is_cloneable', 'weight', 'choice_set', 'choices', 'validation_minimum', 'validation_maximum', - 'validation_regex', 'comments', 'created', 'last_updated', + 'validation_regex', 'validation_schema', 'comments', 'created', 'last_updated', ) default_columns = ( 'pk', 'name', 'object_types', 'label', 'group_name', 'type', 'required', 'unique', 'description', diff --git a/netbox/extras/tests/test_customfields.py b/netbox/extras/tests/test_customfields.py index a8b65f119..cb6f0ecae 100644 --- a/netbox/extras/tests/test_customfields.py +++ b/netbox/extras/tests/test_customfields.py @@ -655,6 +655,45 @@ class CustomFieldTest(TestCase): default=["xxx"] ).full_clean() + def test_validation_schema_only_for_json_type(self): + schema = { + 'type': 'object', + 'properties': { + 'name': {'type': 'string'}, + }, + } + + # Valid: schema on a JSON field + CustomField(name='test', type=CustomFieldTypeChoices.TYPE_JSON, validation_schema=schema).full_clean() + + # Invalid: schema on a non-JSON field + with self.assertRaises(ValidationError): + CustomField(name='test', type=CustomFieldTypeChoices.TYPE_TEXT, validation_schema=schema).full_clean() + with self.assertRaises(ValidationError): + CustomField(name='test', type=CustomFieldTypeChoices.TYPE_INTEGER, validation_schema=schema).full_clean() + + def test_json_schema_default_validation(self): + schema = { + 'type': 'object', + 'properties': { + 'name': {'type': 'string'}, + }, + 'required': ['name'], + } + + # Valid default + CustomField( + name='test', type=CustomFieldTypeChoices.TYPE_JSON, + validation_schema=schema, default={'name': 'test'} + ).full_clean() + + # Invalid default (missing required 'name') + with self.assertRaises(ValidationError): + CustomField( + name='test', type=CustomFieldTypeChoices.TYPE_JSON, + validation_schema=schema, default={'age': 25} + ).full_clean() + class CustomFieldManagerTest(TestCase): @@ -1322,6 +1361,42 @@ class CustomFieldAPITest(APITestCase): response = self.client.patch(url, data, format='json', **self.header) self.assertHttpStatus(response, status.HTTP_200_OK) + def test_json_schema_validation(self): + site2 = Site.objects.get(name='Site 2') + url = reverse('dcim-api:site-detail', kwargs={'pk': site2.pk}) + self.add_permissions('dcim.change_site') + + cf_json = CustomField.objects.get(name='json_field') + cf_json.validation_schema = { + 'type': 'object', + 'properties': { + 'name': {'type': 'string'}, + 'age': {'type': 'integer'}, + }, + 'required': ['name'], + } + cf_json.save() + + # Invalid: missing required 'name' property + data = {'custom_fields': {'json_field': {'age': 25}}} + response = self.client.patch(url, data, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) + + # Invalid: 'age' is not an integer + data = {'custom_fields': {'json_field': {'name': 'test', 'age': 'not_an_int'}}} + response = self.client.patch(url, data, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) + + # Valid: conforms to schema + data = {'custom_fields': {'json_field': {'name': 'test', 'age': 25}}} + response = self.client.patch(url, data, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_200_OK) + + # Valid: null value (schema not enforced on empty) + data = {'custom_fields': {'json_field': None}} + response = self.client.patch(url, data, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_200_OK) + def test_uniqueness_validation(self): # Create a unique custom field cf_text = CustomField.objects.get(name='text_field') diff --git a/netbox/extras/tests/test_filtersets.py b/netbox/extras/tests/test_filtersets.py index d661854d6..764166a63 100644 --- a/netbox/extras/tests/test_filtersets.py +++ b/netbox/extras/tests/test_filtersets.py @@ -22,7 +22,7 @@ from virtualization.models import Cluster, ClusterGroup, ClusterType class CustomFieldTestCase(TestCase, ChangeLoggedFilterSetTests): queryset = CustomField.objects.all() filterset = CustomFieldFilterSet - ignore_fields = ('default', 'related_object_filter') + ignore_fields = ('default', 'related_object_filter', 'validation_schema') @classmethod def setUpTestData(cls): diff --git a/netbox/utilities/jsonschema.py b/netbox/utilities/jsonschema.py index db2907199..708e38307 100644 --- a/netbox/utilities/jsonschema.py +++ b/netbox/utilities/jsonschema.py @@ -160,8 +160,6 @@ def validate_schema(schema): # Provide some basic sanity checking (not provided by jsonschema) if type(schema) is not dict: raise ValidationError(_("Invalid JSON schema definition")) - if not schema.get('properties'): - raise ValidationError(_("JSON schema must define properties")) try: ValidatorClass = validator_for(schema) ValidatorClass.check_schema(schema) From 95011821bb96137b01805cea5e7f1f856bebb820 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 31 Mar 2026 16:01:40 -0400 Subject: [PATCH 048/104] Closes #21771: Add add_tags & remove_tags fields for taggable objects --- netbox/dcim/tests/test_api.py | 177 +++++++++++++++++++++- netbox/netbox/api/serializers/features.py | 52 +++++++ netbox/utilities/testing/api.py | 4 +- 3 files changed, 229 insertions(+), 4 deletions(-) diff --git a/netbox/dcim/tests/test_api.py b/netbox/dcim/tests/test_api.py index df12d0dec..b74ed1e42 100644 --- a/netbox/dcim/tests/test_api.py +++ b/netbox/dcim/tests/test_api.py @@ -5,16 +5,17 @@ from django.urls import reverse from django.utils.translation import gettext as _ from rest_framework import status +from core.models import ObjectType from dcim.choices import * from dcim.constants import * from dcim.models import * -from extras.models import ConfigTemplate +from extras.models import ConfigTemplate, Tag from ipam.choices import VLANQinQRoleChoices from ipam.models import ASN, RIR, VLAN, VRF from netbox.api.serializers import GenericObjectSerializer from tenancy.models import Tenant from users.constants import TOKEN_PREFIX -from users.models import Token, User +from users.models import ObjectPermission, Token, User from utilities.testing import APITestCase, APIViewTestCases, create_test_device, disable_logging from virtualization.models import Cluster, ClusterType from wireless.choices import WirelessChannelChoices @@ -195,6 +196,178 @@ class SiteTest(APIViewTestCases.APIViewTestCase): }, ] + def test_add_tags(self): + """ + Add tags to an existing object via the add_tags field. + """ + site = Site.objects.first() + tags = Tag.objects.bulk_create(( + Tag(name='Alpha', slug='alpha'), + Tag(name='Bravo', slug='bravo'), + Tag(name='Charlie', slug='charlie'), + )) + site.tags.set([tags[0], tags[1]]) + + # Grant change permission + obj_perm = ObjectPermission(name='Test permission', actions=['change']) + obj_perm.save() + obj_perm.users.add(self.user) + obj_perm.object_types.add(ObjectType.objects.get_for_model(self.model)) + + url = self._get_detail_url(site) + data = { + 'add_tags': [{'name': 'Charlie'}], + } + response = self.client.patch(url, data, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_200_OK) + + # Verify all three tags are now assigned + tag_names = sorted(site.tags.values_list('name', flat=True)) + self.assertEqual(tag_names, ['Alpha', 'Bravo', 'Charlie']) + + # Verify add_tags and remove_tags are not in the response + self.assertNotIn('add_tags', response.data) + self.assertNotIn('remove_tags', response.data) + self.assertIn('tags', response.data) + + def test_remove_tags(self): + """ + Remove tags from an existing object via the remove_tags field. + """ + site = Site.objects.first() + tags = Tag.objects.bulk_create(( + Tag(name='Alpha', slug='alpha'), + Tag(name='Bravo', slug='bravo'), + Tag(name='Charlie', slug='charlie'), + )) + site.tags.set(tags) + + # Grant change permission + obj_perm = ObjectPermission(name='Test permission', actions=['change']) + obj_perm.save() + obj_perm.users.add(self.user) + obj_perm.object_types.add(ObjectType.objects.get_for_model(self.model)) + + url = self._get_detail_url(site) + data = { + 'remove_tags': [{'name': 'Charlie'}], + } + response = self.client.patch(url, data, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_200_OK) + + # Verify only Alpha and Bravo remain + tag_names = sorted(site.tags.values_list('name', flat=True)) + self.assertEqual(tag_names, ['Alpha', 'Bravo']) + + def test_remove_tags_not_assigned(self): + """ + Removing a tag that is not assigned should not raise an error. + """ + site = Site.objects.first() + tags = Tag.objects.bulk_create(( + Tag(name='Alpha', slug='alpha'), + Tag(name='Bravo', slug='bravo'), + Tag(name='Charlie', slug='charlie'), + )) + site.tags.set([tags[0], tags[1]]) + + # Grant change permission + obj_perm = ObjectPermission(name='Test permission', actions=['change']) + obj_perm.save() + obj_perm.users.add(self.user) + obj_perm.object_types.add(ObjectType.objects.get_for_model(self.model)) + + url = self._get_detail_url(site) + data = { + 'remove_tags': [{'name': 'Charlie'}], + } + response = self.client.patch(url, data, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_200_OK) + + # Tags should be unchanged + tag_names = sorted(site.tags.values_list('name', flat=True)) + self.assertEqual(tag_names, ['Alpha', 'Bravo']) + + def test_add_and_remove_tags(self): + """ + Add and remove tags in the same request. + """ + site = Site.objects.first() + tags = Tag.objects.bulk_create(( + Tag(name='Alpha', slug='alpha'), + Tag(name='Bravo', slug='bravo'), + Tag(name='Charlie', slug='charlie'), + )) + site.tags.set([tags[0], tags[1]]) + + # Grant change permission + obj_perm = ObjectPermission(name='Test permission', actions=['change']) + obj_perm.save() + obj_perm.users.add(self.user) + obj_perm.object_types.add(ObjectType.objects.get_for_model(self.model)) + + url = self._get_detail_url(site) + data = { + 'add_tags': [{'name': 'Charlie'}], + 'remove_tags': [{'name': 'Alpha'}], + } + response = self.client.patch(url, data, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_200_OK) + + # Verify Bravo and Charlie remain + tag_names = sorted(site.tags.values_list('name', flat=True)) + self.assertEqual(tag_names, ['Bravo', 'Charlie']) + + def test_tags_with_add_tags_error(self): + """ + Specifying tags together with add_tags or remove_tags should raise a validation error. + """ + site = Site.objects.first() + Tag.objects.bulk_create(( + Tag(name='Alpha', slug='alpha'), + Tag(name='Bravo', slug='bravo'), + )) + + # Grant change permission + obj_perm = ObjectPermission(name='Test permission', actions=['change']) + obj_perm.save() + obj_perm.users.add(self.user) + obj_perm.object_types.add(ObjectType.objects.get_for_model(self.model)) + + url = self._get_detail_url(site) + data = { + 'tags': [{'name': 'Alpha'}], + 'add_tags': [{'name': 'Bravo'}], + } + response = self.client.patch(url, data, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) + + def test_create_with_add_tags(self): + """ + Create a new object using add_tags. + """ + Tag.objects.bulk_create(( + Tag(name='Alpha', slug='alpha'), + Tag(name='Bravo', slug='bravo'), + )) + + obj_perm = ObjectPermission(name='Test permission', actions=['add']) + obj_perm.save() + obj_perm.users.add(self.user) + obj_perm.object_types.add(ObjectType.objects.get_for_model(self.model)) + + data = { + 'name': 'Site 10', + 'slug': 'site-10', + 'add_tags': [{'name': 'Alpha'}, {'name': 'Bravo'}], + } + response = self.client.post(self._get_list_url(), data, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_201_CREATED) + + site = Site.objects.get(pk=response.data['id']) + tag_names = sorted(site.tags.values_list('name', flat=True)) + self.assertEqual(tag_names, ['Alpha', 'Bravo']) + class LocationTest(APIViewTestCases.APIViewTestCase): model = Location diff --git a/netbox/netbox/api/serializers/features.py b/netbox/netbox/api/serializers/features.py index 6a89e7b1c..2ff1cc7f5 100644 --- a/netbox/netbox/api/serializers/features.py +++ b/netbox/netbox/api/serializers/features.py @@ -30,17 +30,62 @@ class TaggableModelSerializer(serializers.Serializer): on create() and update(). """ tags = NestedTagSerializer(many=True, required=False) + add_tags = NestedTagSerializer(many=True, required=False, write_only=True) + remove_tags = NestedTagSerializer(many=True, required=False, write_only=True) + + def to_internal_value(self, data): + ret = super().to_internal_value(data) + + # Workaround to bypass requirement to include add_tags/remove_tags in Meta.fields on every serializer + if type(data) is dict: + tag_serializer = NestedTagSerializer(many=True) + for field_name in ('add_tags', 'remove_tags'): + if field_name in data: + ret[field_name] = tag_serializer.to_internal_value(data[field_name]) + + return ret + + def validate(self, data): + # Skip validation for nested serializer representations (e.g. when used as a related field) + if type(data) is not dict: + return super().validate(data) + + if data.get('tags') and (data.get('add_tags') or data.get('remove_tags')): + raise serializers.ValidationError({ + 'tags': 'Cannot specify "tags" together with "add_tags" or "remove_tags".' + }) + + # Pop add_tags/remove_tags before calling super() to prevent them from being passed + # to the model constructor during ValidatedModelSerializer validation + add_tags = data.pop('add_tags', None) + remove_tags = data.pop('remove_tags', None) + + data = super().validate(data) + + # Restore for use in create()/update() + if add_tags is not None: + data['add_tags'] = add_tags + if remove_tags is not None: + data['remove_tags'] = remove_tags + + return data def create(self, validated_data): tags = validated_data.pop('tags', None) + add_tags = validated_data.pop('add_tags', None) + validated_data.pop('remove_tags', None) instance = super().create(validated_data) if tags is not None: return self._save_tags(instance, tags) + if add_tags is not None: + instance.tags.add(*[t.name for t in add_tags]) return instance def update(self, instance, validated_data): tags = validated_data.pop('tags', None) + add_tags = validated_data.pop('add_tags', None) + remove_tags = validated_data.pop('remove_tags', None) # Cache tags on instance for change logging instance._tags = tags or [] @@ -49,6 +94,13 @@ class TaggableModelSerializer(serializers.Serializer): if tags is not None: return self._save_tags(instance, tags) + if add_tags is not None: + instance.tags.add(*[t.name for t in add_tags]) + if remove_tags is not None: + instance.tags.remove(*[t.name for t in remove_tags]) + if add_tags is not None or remove_tags is not None: + instance._tags = instance.tags.all() + return instance def _save_tags(self, instance, tags): diff --git a/netbox/utilities/testing/api.py b/netbox/utilities/testing/api.py index c2a83a8fb..9899edd24 100644 --- a/netbox/utilities/testing/api.py +++ b/netbox/utilities/testing/api.py @@ -286,7 +286,7 @@ class APIViewTestCases: self.assertEqual(self._get_queryset().count(), initial_count + len(self.create_data)) for i, obj in enumerate(response.data): for field in self.create_data[i]: - if field == 'changelog_message': + if field in ('changelog_message', 'add_tags', 'remove_tags'): # Write-only field continue if field not in self.validation_excluded_fields: @@ -444,7 +444,7 @@ class APIViewTestCases: self.assertHttpStatus(response, status.HTTP_200_OK) for i, obj in enumerate(response.data): for field in self.bulk_update_data: - if field == 'changelog_data': + if field in ('changelog_message', 'add_tags', 'remove_tags'): # Write-only field continue self.assertIn(field, obj, f"Bulk update field '{field}' missing from object {i} in response") From 8bc691099cf9bf6e7a9fcd327d1a7abdfaf703b8 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 31 Mar 2026 16:38:15 -0400 Subject: [PATCH 049/104] Raise a validation error if remove_tags is specified when creating an object --- netbox/dcim/tests/test_api.py | 21 +++++++++++++++++++++ netbox/netbox/api/serializers/features.py | 5 +++++ 2 files changed, 26 insertions(+) diff --git a/netbox/dcim/tests/test_api.py b/netbox/dcim/tests/test_api.py index b74ed1e42..788bc1c5a 100644 --- a/netbox/dcim/tests/test_api.py +++ b/netbox/dcim/tests/test_api.py @@ -368,6 +368,27 @@ class SiteTest(APIViewTestCases.APIViewTestCase): tag_names = sorted(site.tags.values_list('name', flat=True)) self.assertEqual(tag_names, ['Alpha', 'Bravo']) + def test_create_with_remove_tags_error(self): + """ + Using remove_tags when creating a new object should raise a validation error. + """ + Tag.objects.bulk_create(( + Tag(name='Alpha', slug='alpha'), + )) + + obj_perm = ObjectPermission(name='Test permission', actions=['add']) + obj_perm.save() + obj_perm.users.add(self.user) + obj_perm.object_types.add(ObjectType.objects.get_for_model(self.model)) + + data = { + 'name': 'Site 10', + 'slug': 'site-10', + 'remove_tags': [{'name': 'Alpha'}], + } + response = self.client.post(self._get_list_url(), data, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) + class LocationTest(APIViewTestCases.APIViewTestCase): model = Location diff --git a/netbox/netbox/api/serializers/features.py b/netbox/netbox/api/serializers/features.py index 2ff1cc7f5..382ba7891 100644 --- a/netbox/netbox/api/serializers/features.py +++ b/netbox/netbox/api/serializers/features.py @@ -55,6 +55,11 @@ class TaggableModelSerializer(serializers.Serializer): 'tags': 'Cannot specify "tags" together with "add_tags" or "remove_tags".' }) + if self.instance is None and data.get('remove_tags'): + raise serializers.ValidationError({ + 'remove_tags': 'Cannot use "remove_tags" when creating a new object.' + }) + # Pop add_tags/remove_tags before calling super() to prevent them from being passed # to the model constructor during ValidatedModelSerializer validation add_tags = data.pop('add_tags', None) From 76c02d5aa95d64dc1950b3bbf9eb062ed54066d2 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 31 Mar 2026 16:44:37 -0400 Subject: [PATCH 050/104] Raise a validation error if the same tag is present in both add_tags and remove_tags --- netbox/dcim/tests/test_api.py | 23 +++++++++++++++++++++++ netbox/netbox/api/serializers/features.py | 11 +++++++++++ 2 files changed, 34 insertions(+) diff --git a/netbox/dcim/tests/test_api.py b/netbox/dcim/tests/test_api.py index 788bc1c5a..0c59cf31a 100644 --- a/netbox/dcim/tests/test_api.py +++ b/netbox/dcim/tests/test_api.py @@ -389,6 +389,29 @@ class SiteTest(APIViewTestCases.APIViewTestCase): response = self.client.post(self._get_list_url(), data, format='json', **self.header) self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) + def test_add_and_remove_same_tag_error(self): + """ + Including the same tag in both add_tags and remove_tags should raise a validation error. + """ + site = Site.objects.first() + Tag.objects.bulk_create(( + Tag(name='Alpha', slug='alpha'), + Tag(name='Bravo', slug='bravo'), + )) + + obj_perm = ObjectPermission(name='Test permission', actions=['change']) + obj_perm.save() + obj_perm.users.add(self.user) + obj_perm.object_types.add(ObjectType.objects.get_for_model(self.model)) + + url = self._get_detail_url(site) + data = { + 'add_tags': [{'name': 'Alpha'}, {'name': 'Bravo'}], + 'remove_tags': [{'name': 'Alpha'}], + } + response = self.client.patch(url, data, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) + class LocationTest(APIViewTestCases.APIViewTestCase): model = Location diff --git a/netbox/netbox/api/serializers/features.py b/netbox/netbox/api/serializers/features.py index 382ba7891..45e7bce17 100644 --- a/netbox/netbox/api/serializers/features.py +++ b/netbox/netbox/api/serializers/features.py @@ -60,6 +60,17 @@ class TaggableModelSerializer(serializers.Serializer): 'remove_tags': 'Cannot use "remove_tags" when creating a new object.' }) + if data.get('add_tags') and data.get('remove_tags'): + add_pks = {t.pk for t in data['add_tags']} + remove_pks = {t.pk for t in data['remove_tags']} + overlap = [t for t in data['add_tags'] if t.pk in (add_pks & remove_pks)] + if overlap: + raise serializers.ValidationError({ + 'remove_tags': + f'Tags may not be present in both "add_tags" and "remove_tags": ' + f'{", ".join(t.name for t in overlap)}' + }) + # Pop add_tags/remove_tags before calling super() to prevent them from being passed # to the model constructor during ValidatedModelSerializer validation add_tags = data.pop('add_tags', None) From d4569df30598c96f47c8661493906c1d35e9e5db Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 1 Apr 2026 10:29:49 -0400 Subject: [PATCH 051/104] Closes #21770: Enable including/excluding columns on ObjectsTablePanel --- netbox/netbox/ui/panels.py | 10 +++++++++- netbox/netbox/views/generic/mixins.py | 12 ++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/netbox/netbox/ui/panels.py b/netbox/netbox/ui/panels.py index f58e98449..7aaf0e874 100644 --- a/netbox/netbox/ui/panels.py +++ b/netbox/netbox/ui/panels.py @@ -282,11 +282,13 @@ class ObjectsTablePanel(Panel): model (str): The dotted label of the model to be added (e.g. "dcim.site") filters (dict): A dictionary of arbitrary URL parameters to append to the table's URL. If the value of a key is a callable, it will be passed the current template context. + include_columns (list): A list of column names to display exclusively (overrides user preferences) + exclude_columns (list): A list of column names to hide from the table (overrides user preferences) """ template_name = 'ui/panels/objects_table.html' title = None - def __init__(self, model, filters=None, **kwargs): + def __init__(self, model, filters=None, include_columns=None, exclude_columns=None, **kwargs): super().__init__(**kwargs) # Resolve the model class from its app.name label @@ -297,6 +299,8 @@ class ObjectsTablePanel(Panel): raise ValueError(f"Invalid model label: {model}") self.filters = filters or {} + self.include_columns = include_columns or [] + self.exclude_columns = exclude_columns or [] # If no title is specified, derive one from the model name if self.title is None: @@ -308,6 +312,10 @@ class ObjectsTablePanel(Panel): } if 'return_url' not in url_params and 'object' in context: url_params['return_url'] = context['object'].get_absolute_url() + if self.include_columns: + url_params['include_columns'] = ','.join(self.include_columns) + if self.exclude_columns: + url_params['exclude_columns'] = ','.join(self.exclude_columns) return { **super().get_context(context), 'viewname': get_viewname(self.model, 'list'), diff --git a/netbox/netbox/views/generic/mixins.py b/netbox/netbox/views/generic/mixins.py index 6e40e4175..031dddb2d 100644 --- a/netbox/netbox/views/generic/mixins.py +++ b/netbox/netbox/views/generic/mixins.py @@ -97,4 +97,16 @@ class TableMixin: table.columns.show('pk') table.configure(request) + # Apply column inclusion/exclusion (overrides user preferences) + if include_columns := request.GET.get('include_columns'): + include_columns = include_columns.split(',') + for column in table.columns: + if column.name not in table.exempt_columns and column.name not in include_columns: + table.columns.hide(column.name) + elif exclude_columns := request.GET.get('exclude_columns'): + exclude_columns = exclude_columns.split(',') + for column_name in exclude_columns: + if column_name in table.columns.names(): + table.columns.hide(column_name) + return table From 364868a207b51f225a43a47c649c7d345f049361 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 1 Apr 2026 10:54:34 -0400 Subject: [PATCH 052/104] Implement exclude_columns on embedded tables --- netbox/circuits/views.py | 5 +++++ netbox/core/views.py | 1 + netbox/dcim/views.py | 13 +++++++++++++ netbox/ipam/views.py | 2 ++ netbox/tenancy/views.py | 3 +++ netbox/users/views.py | 19 ++++++++++++++++--- netbox/virtualization/views.py | 4 ++++ netbox/vpn/views.py | 3 +++ netbox/wireless/views.py | 1 + 9 files changed, 48 insertions(+), 3 deletions(-) diff --git a/netbox/circuits/views.py b/netbox/circuits/views.py index ddb4ef358..d6dad2e46 100644 --- a/netbox/circuits/views.py +++ b/netbox/circuits/views.py @@ -53,6 +53,7 @@ class ProviderView(GetRelatedModelsMixin, generic.ObjectView): ObjectsTablePanel( model='circuits.ProviderAccount', filters={'provider_id': lambda ctx: ctx['object'].pk}, + exclude_columns=['provider'], actions=[ actions.AddObject( 'circuits.ProviderAccount', url_params={'provider': lambda ctx: ctx['object'].pk} @@ -62,6 +63,7 @@ class ProviderView(GetRelatedModelsMixin, generic.ObjectView): ObjectsTablePanel( model='circuits.Circuit', filters={'provider_id': lambda ctx: ctx['object'].pk}, + exclude_columns=['provider'], actions=[ actions.AddObject('circuits.Circuit', url_params={'provider': lambda ctx: ctx['object'].pk}), ], @@ -161,6 +163,7 @@ class ProviderAccountView(GetRelatedModelsMixin, generic.ObjectView): ObjectsTablePanel( model='circuits.Circuit', filters={'provider_account_id': lambda ctx: ctx['object'].pk}, + exclude_columns=['provider_account'], actions=[ actions.AddObject( 'circuits.Circuit', @@ -257,6 +260,7 @@ class ProviderNetworkView(GetRelatedModelsMixin, generic.ObjectView): ObjectsTablePanel( model='circuits.VirtualCircuit', filters={'provider_network_id': lambda ctx: ctx['object'].pk}, + exclude_columns=['provider_network'], actions=[ actions.AddObject( 'circuits.VirtualCircuit', url_params={'provider_network': lambda ctx: ctx['object'].pk} @@ -801,6 +805,7 @@ class VirtualCircuitView(generic.ObjectView): model='circuits.VirtualCircuitTermination', title=_('Terminations'), filters={'virtual_circuit_id': lambda ctx: ctx['object'].pk}, + exclude_columns=['virtual_circuit'], actions=[ actions.AddObject( 'circuits.VirtualCircuitTermination', diff --git a/netbox/core/views.py b/netbox/core/views.py index 6531fb7b2..328679fa9 100644 --- a/netbox/core/views.py +++ b/netbox/core/views.py @@ -94,6 +94,7 @@ class DataSourceView(GetRelatedModelsMixin, generic.ObjectView): ObjectsTablePanel( model='core.DataFile', filters={'source_id': lambda ctx: ctx['object'].pk}, + exclude_columns=['source'], ), ], ) diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index acf335b69..a28562385 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -258,6 +258,7 @@ class RegionView(GetRelatedModelsMixin, generic.ObjectView): model='dcim.Region', title=_('Child Regions'), filters={'parent_id': lambda ctx: ctx['object'].pk}, + exclude_columns=['parent'], actions=[ actions.AddObject('dcim.Region', url_params={'parent': lambda ctx: ctx['object'].pk}), ], @@ -390,6 +391,7 @@ class SiteGroupView(GetRelatedModelsMixin, generic.ObjectView): model='dcim.SiteGroup', title=_('Child Groups'), filters={'parent_id': lambda ctx: ctx['object'].pk}, + exclude_columns=['parent'], actions=[ actions.AddObject('dcim.SiteGroup', url_params={'parent': lambda ctx: ctx['object'].pk}), ], @@ -540,6 +542,7 @@ class SiteView(GetRelatedModelsMixin, generic.ObjectView): ObjectsTablePanel( model='dcim.Location', filters={'site_id': lambda ctx: ctx['object'].pk}, + exclude_columns=['site'], actions=[ actions.AddObject('dcim.Location', url_params={'site': lambda ctx: ctx['object'].pk}), ], @@ -552,6 +555,7 @@ class SiteView(GetRelatedModelsMixin, generic.ObjectView): 'rack_id': settings.FILTERS_NULL_CHOICE_VALUE, 'parent_bay_id': settings.FILTERS_NULL_CHOICE_VALUE, }, + exclude_columns=['site'], actions=[ actions.AddObject('dcim.Device', url_params={'site': lambda ctx: ctx['object'].pk}), ], @@ -674,6 +678,7 @@ class LocationView(GetRelatedModelsMixin, generic.ObjectView): model='dcim.Location', title=_('Child Locations'), filters={'parent_id': lambda ctx: ctx['object'].pk}, + exclude_columns=['parent'], actions=[ actions.AddObject( 'dcim.Location', @@ -692,6 +697,7 @@ class LocationView(GetRelatedModelsMixin, generic.ObjectView): 'rack_id': settings.FILTERS_NULL_CHOICE_VALUE, 'parent_bay_id': settings.FILTERS_NULL_CHOICE_VALUE, }, + exclude_columns=['location'], actions=[ actions.AddObject( 'dcim.Device', @@ -1686,6 +1692,7 @@ class ModuleTypeProfileView(generic.ObjectView): filters={ 'profile_id': lambda ctx: ctx['object'].pk, }, + exclude_columns=['profile'], actions=[ actions.AddObject( 'dcim.ModuleType', @@ -2427,6 +2434,7 @@ class DeviceRoleView(GetRelatedModelsMixin, generic.ObjectView): model='dcim.DeviceRole', title=_('Child Device Roles'), filters={'parent_id': lambda ctx: ctx['object'].pk}, + exclude_columns=['parent'], actions=[ actions.AddObject('dcim.DeviceRole', url_params={'parent': lambda ctx: ctx['object'].pk}), ], @@ -2527,6 +2535,7 @@ class PlatformView(GetRelatedModelsMixin, generic.ObjectView): model='dcim.Platform', title=_('Child Platforms'), filters={'parent_id': lambda ctx: ctx['object'].pk}, + exclude_columns=['parent'], actions=[ actions.AddObject('dcim.Platform', url_params={'parent': lambda ctx: ctx['object'].pk}), ], @@ -2605,6 +2614,7 @@ class DeviceView(generic.ObjectView): ObjectsTablePanel( model='dcim.VirtualDeviceContext', filters={'device_id': lambda ctx: ctx['object'].pk}, + exclude_columns=['device'], actions=[ actions.AddObject('dcim.VirtualDeviceContext', url_params={'device': lambda ctx: ctx['object'].pk}), ], @@ -2617,6 +2627,7 @@ class DeviceView(generic.ObjectView): model='ipam.Service', title=_('Application Services'), filters={'device_id': lambda ctx: ctx['object'].pk}, + exclude_columns=['device'], actions=[ actions.AddObject( 'ipam.Service', @@ -3376,11 +3387,13 @@ class InterfaceView(generic.ObjectView): model='ipam.IPAddress', filters={'interface_id': lambda ctx: ctx['object'].pk}, title=_('IP Addresses'), + exclude_columns=['assigned'], ), ObjectsTablePanel( model='dcim.MACAddress', filters={'interface_id': lambda ctx: ctx['object'].pk}, title=_('MAC Addresses'), + exclude_columns=['assigned_object', 'assigned_object_parent'], ), ObjectsTablePanel( model='ipam.VLAN', diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 3f8f9eba2..4fc30342b 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -1331,6 +1331,7 @@ class VLANTranslationPolicyView(generic.ObjectView): 'ipam.vlantranslationrule', filters={'policy_id': lambda ctx: ctx['object'].pk}, title=_('VLAN translation rules'), + exclude_columns=['policy'], actions=[ actions.AddObject( 'ipam.vlantranslationrule', @@ -1628,6 +1629,7 @@ class VLANView(generic.ObjectView): 'ipam.prefix', filters={'vlan_id': lambda ctx: ctx['object'].pk}, title=_('Prefixes'), + exclude_columns=['vlan'], actions=[ actions.AddObject( 'ipam.prefix', diff --git a/netbox/tenancy/views.py b/netbox/tenancy/views.py index 26b0ac5ab..7ebc1ab82 100644 --- a/netbox/tenancy/views.py +++ b/netbox/tenancy/views.py @@ -57,6 +57,7 @@ class TenantGroupView(GetRelatedModelsMixin, generic.ObjectView): 'tenancy.tenantgroup', filters={'parent_id': lambda ctx: ctx['object'].pk}, title=_('Child Groups'), + exclude_columns=['parent'], actions=[ actions.AddObject( 'tenancy.tenantgroup', @@ -235,6 +236,7 @@ class ContactGroupView(GetRelatedModelsMixin, generic.ObjectView): 'tenancy.contactgroup', filters={'parent_id': lambda ctx: ctx['object'].pk}, title=_('Child Groups'), + exclude_columns=['parent'], actions=[ actions.AddObject( 'tenancy.contactgroup', @@ -414,6 +416,7 @@ class ContactView(generic.ObjectView): 'tenancy.contactassignment', filters={'contact_id': lambda ctx: ctx['object'].pk}, title=_('Assignments'), + exclude_columns=['contact'], ), ], ) diff --git a/netbox/users/views.py b/netbox/users/views.py index 59ebe518f..bf50919a0 100644 --- a/netbox/users/views.py +++ b/netbox/users/views.py @@ -200,7 +200,11 @@ class GroupView(generic.ObjectView): OrganizationalObjectPanel(), ], right_panels=[ - ObjectsTablePanel('users.User', filters={'group_id': lambda ctx: ctx['object'].pk}), + ObjectsTablePanel( + 'users.User', + filters={'group_id': lambda ctx: ctx['object'].pk}, + exclude_columns=['group'], + ), ObjectsTablePanel( 'users.ObjectPermission', title=_('Assigned Permissions'), @@ -345,6 +349,7 @@ class OwnerGroupView(generic.ObjectView): 'users.Owner', filters={'group_id': lambda ctx: ctx['object'].pk}, title=_('Members'), + exclude_columns=['group'], actions=[ actions.AddObject( 'users.Owner', @@ -412,8 +417,16 @@ class OwnerView(GetRelatedModelsMixin, generic.ObjectView): layout = layout.SimpleLayout( left_panels=[ panels.OwnerPanel(), - ObjectsTablePanel('users.Group', filters={'owner_id': lambda ctx: ctx['object'].pk}), - ObjectsTablePanel('users.User', filters={'owner_id': lambda ctx: ctx['object'].pk}), + ObjectsTablePanel( + 'users.Group', + filters={'owner_id': lambda ctx: ctx['object'].pk}, + exclude_columns=['owner'], + ), + ObjectsTablePanel( + 'users.User', + filters={'owner_id': lambda ctx: ctx['object'].pk}, + exclude_columns=['owner'], + ), ], right_panels=[ RelatedObjectsPanel(), diff --git a/netbox/virtualization/views.py b/netbox/virtualization/views.py index 27cd0cb98..fbff67432 100644 --- a/netbox/virtualization/views.py +++ b/netbox/virtualization/views.py @@ -492,6 +492,7 @@ class VirtualMachineView(generic.ObjectView): model='ipam.Service', title=_('Application Services'), filters={'virtual_machine_id': lambda ctx: ctx['object'].pk}, + exclude_columns=['parent'], actions=[ actions.AddObject( 'ipam.Service', @@ -508,6 +509,7 @@ class VirtualMachineView(generic.ObjectView): ObjectsTablePanel( model='virtualization.VirtualDisk', filters={'virtual_machine_id': lambda ctx: ctx['object'].pk}, + exclude_columns=['virtual_machine'], actions=[ actions.AddObject( 'virtualization.VirtualDisk', url_params={'virtual_machine': lambda ctx: ctx['object'].pk} @@ -649,6 +651,7 @@ class VMInterfaceView(generic.ObjectView): ObjectsTablePanel( model='ipam.IPaddress', filters={'vminterface_id': lambda ctx: ctx['object'].pk}, + exclude_columns=['assigned'], actions=[ actions.AddObject( 'ipam.IPaddress', @@ -662,6 +665,7 @@ class VMInterfaceView(generic.ObjectView): ObjectsTablePanel( model='dcim.MACAddress', filters={'vminterface_id': lambda ctx: ctx['object'].pk}, + exclude_columns=['assigned_object', 'assigned_object_parent'], actions=[ actions.AddObject( 'dcim.MACAddress', url_params={'vminterface': lambda ctx: ctx['object'].pk} diff --git a/netbox/vpn/views.py b/netbox/vpn/views.py index 7da05e007..e74c53b64 100644 --- a/netbox/vpn/views.py +++ b/netbox/vpn/views.py @@ -129,6 +129,7 @@ class TunnelView(generic.ObjectView): ObjectsTablePanel( 'vpn.tunneltermination', filters={'tunnel_id': lambda ctx: ctx['object'].pk}, + exclude_columns=['tunnel'], actions=[ actions.AddObject( 'vpn.tunneltermination', @@ -223,6 +224,7 @@ class TunnelTerminationView(generic.ObjectView): 'tunnel_id': lambda ctx: ctx['object'].tunnel.pk, 'id__n': lambda ctx: ctx['object'].pk, }, + exclude_columns=['tunnel'], title=_('Peer Terminations'), ), ], @@ -675,6 +677,7 @@ class L2VPNView(generic.ObjectView): ObjectsTablePanel( 'vpn.l2vpntermination', filters={'l2vpn_id': lambda ctx: ctx['object'].pk}, + exclude_columns=['l2vpn'], actions=[ actions.AddObject( 'vpn.l2vpntermination', diff --git a/netbox/wireless/views.py b/netbox/wireless/views.py index fecec1ef9..422b46cc5 100644 --- a/netbox/wireless/views.py +++ b/netbox/wireless/views.py @@ -53,6 +53,7 @@ class WirelessLANGroupView(GetRelatedModelsMixin, generic.ObjectView): model='wireless.WirelessLANGroup', title=_('Child Groups'), filters={'parent_id': lambda ctx: ctx['object'].pk}, + exclude_columns=['parent'], actions=[ actions.AddObject( 'wireless.WirelessLANGroup', From bd35afe3201327627ce4863e3c7b412c9fa07b35 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 1 Apr 2026 14:14:13 -0400 Subject: [PATCH 053/104] Apply column hiding before prefetching --- netbox/netbox/tables/tables.py | 13 +++++++++++++ netbox/netbox/views/generic/mixins.py | 12 ------------ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/netbox/netbox/tables/tables.py b/netbox/netbox/tables/tables.py index d016cbf28..9fd31e196 100644 --- a/netbox/netbox/tables/tables.py +++ b/netbox/netbox/tables/tables.py @@ -185,6 +185,19 @@ class BaseTable(tables.Table): columns = getattr(self.Meta, 'default_columns', self.Meta.fields) self._set_columns(columns) + + # Apply column inclusion/exclusion (overrides user preferences) + if include_columns := request.GET.get('include_columns'): + include_columns = include_columns.split(',') + for column in self.columns: + if column.name not in self.exempt_columns and column.name not in include_columns: + self.columns.hide(column.name) + elif exclude_columns := request.GET.get('exclude_columns'): + exclude_columns = exclude_columns.split(',') + for column_name in exclude_columns: + if column_name in self.columns.names(): + self.columns.hide(column_name) + self._apply_prefetching() if ordering is not None: self.order_by = ordering diff --git a/netbox/netbox/views/generic/mixins.py b/netbox/netbox/views/generic/mixins.py index 031dddb2d..6e40e4175 100644 --- a/netbox/netbox/views/generic/mixins.py +++ b/netbox/netbox/views/generic/mixins.py @@ -97,16 +97,4 @@ class TableMixin: table.columns.show('pk') table.configure(request) - # Apply column inclusion/exclusion (overrides user preferences) - if include_columns := request.GET.get('include_columns'): - include_columns = include_columns.split(',') - for column in table.columns: - if column.name not in table.exempt_columns and column.name not in include_columns: - table.columns.hide(column.name) - elif exclude_columns := request.GET.get('exclude_columns'): - exclude_columns = exclude_columns.split(',') - for column_name in exclude_columns: - if column_name in table.columns.names(): - table.columns.hide(column_name) - return table From a45ec6620a5f85a1b6ff9137aadf2546cc1487d7 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 1 Apr 2026 14:17:57 -0400 Subject: [PATCH 054/104] Protect exempt columns from exclusion --- netbox/netbox/tables/tables.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/netbox/tables/tables.py b/netbox/netbox/tables/tables.py index 9fd31e196..e57b3642b 100644 --- a/netbox/netbox/tables/tables.py +++ b/netbox/netbox/tables/tables.py @@ -195,7 +195,7 @@ class BaseTable(tables.Table): elif exclude_columns := request.GET.get('exclude_columns'): exclude_columns = exclude_columns.split(',') for column_name in exclude_columns: - if column_name in self.columns.names(): + if column_name in self.columns.names() and column_name not in self.exempt_columns: self.columns.hide(column_name) self._apply_prefetching() From f06f8f3f1d2a554090c346d89d98122cc065e8f7 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 1 Apr 2026 14:25:31 -0400 Subject: [PATCH 055/104] Exclude assigned object columns from IP addresses table on interface views --- netbox/dcim/views.py | 2 +- netbox/virtualization/views.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index a28562385..c7488891e 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -3387,7 +3387,7 @@ class InterfaceView(generic.ObjectView): model='ipam.IPAddress', filters={'interface_id': lambda ctx: ctx['object'].pk}, title=_('IP Addresses'), - exclude_columns=['assigned'], + exclude_columns=['assigned', 'assigned_object', 'assigned_object_parent'], ), ObjectsTablePanel( model='dcim.MACAddress', diff --git a/netbox/virtualization/views.py b/netbox/virtualization/views.py index fbff67432..d6a758dad 100644 --- a/netbox/virtualization/views.py +++ b/netbox/virtualization/views.py @@ -651,7 +651,7 @@ class VMInterfaceView(generic.ObjectView): ObjectsTablePanel( model='ipam.IPaddress', filters={'vminterface_id': lambda ctx: ctx['object'].pk}, - exclude_columns=['assigned'], + exclude_columns=['assigned', 'assigned_object', 'assigned_object_parent'], actions=[ actions.AddObject( 'ipam.IPaddress', From be1a29d7ee9b294500e38e736620bd4f0f887d02 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 1 Apr 2026 14:46:53 -0400 Subject: [PATCH 056/104] Misc cleanup --- netbox/dcim/views.py | 2 +- netbox/users/views.py | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index c7488891e..5ebb22c6b 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -2627,7 +2627,7 @@ class DeviceView(generic.ObjectView): model='ipam.Service', title=_('Application Services'), filters={'device_id': lambda ctx: ctx['object'].pk}, - exclude_columns=['device'], + exclude_columns=['parent'], actions=[ actions.AddObject( 'ipam.Service', diff --git a/netbox/users/views.py b/netbox/users/views.py index bf50919a0..928775101 100644 --- a/netbox/users/views.py +++ b/netbox/users/views.py @@ -203,7 +203,6 @@ class GroupView(generic.ObjectView): ObjectsTablePanel( 'users.User', filters={'group_id': lambda ctx: ctx['object'].pk}, - exclude_columns=['group'], ), ObjectsTablePanel( 'users.ObjectPermission', @@ -420,12 +419,10 @@ class OwnerView(GetRelatedModelsMixin, generic.ObjectView): ObjectsTablePanel( 'users.Group', filters={'owner_id': lambda ctx: ctx['object'].pk}, - exclude_columns=['owner'], ), ObjectsTablePanel( 'users.User', filters={'owner_id': lambda ctx: ctx['object'].pk}, - exclude_columns=['owner'], ), ], right_panels=[ From 6c08941542466d9bae25e82d3e0350a44ad18530 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 1 Apr 2026 14:58:41 -0400 Subject: [PATCH 057/104] Tweak behavior of include_columns --- netbox/netbox/tables/tables.py | 11 +++++------ netbox/netbox/ui/panels.py | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/netbox/netbox/tables/tables.py b/netbox/netbox/tables/tables.py index e57b3642b..931da4f77 100644 --- a/netbox/netbox/tables/tables.py +++ b/netbox/netbox/tables/tables.py @@ -187,12 +187,11 @@ class BaseTable(tables.Table): self._set_columns(columns) # Apply column inclusion/exclusion (overrides user preferences) - if include_columns := request.GET.get('include_columns'): - include_columns = include_columns.split(',') - for column in self.columns: - if column.name not in self.exempt_columns and column.name not in include_columns: - self.columns.hide(column.name) - elif exclude_columns := request.GET.get('exclude_columns'): + if columns_param := request.GET.get('include_columns'): + for column_name in columns_param.split(','): + if column_name in self.columns.names(): + self.columns.show(column_name) + if exclude_columns := request.GET.get('exclude_columns'): exclude_columns = exclude_columns.split(',') for column_name in exclude_columns: if column_name in self.columns.names() and column_name not in self.exempt_columns: diff --git a/netbox/netbox/ui/panels.py b/netbox/netbox/ui/panels.py index 7aaf0e874..fa26cf754 100644 --- a/netbox/netbox/ui/panels.py +++ b/netbox/netbox/ui/panels.py @@ -282,7 +282,7 @@ class ObjectsTablePanel(Panel): model (str): The dotted label of the model to be added (e.g. "dcim.site") filters (dict): A dictionary of arbitrary URL parameters to append to the table's URL. If the value of a key is a callable, it will be passed the current template context. - include_columns (list): A list of column names to display exclusively (overrides user preferences) + include_columns (list): A list of column names to always display (overrides user preferences) exclude_columns (list): A list of column names to hide from the table (overrides user preferences) """ template_name = 'ui/panels/objects_table.html' From a06a3009134fc18ec3c593d47697e1c015f75a6c Mon Sep 17 00:00:00 2001 From: Mark Robert Coleman Date: Thu, 2 Apr 2026 02:58:16 +0200 Subject: [PATCH 058/104] Implement {module} position inheritance for nested module bays (#21753) * Implement {module} position inheritance for nested module bays (#19796) Enables a single ModuleType to produce correctly named components at any nesting depth by resolving {module} in module bay position fields during tree traversal. The user controls the separator through the position field template itself (e.g. {module}/1 vs {module}-1 vs {module}.1). Model layer: - Add _get_inherited_positions() to resolve {module} in positions as the module tree is walked from root to leaf - Update _resolve_module_placeholder() with single-token logic: one {module} resolves to the leaf bay's inherited position; multi-token continues level-by-level replacement for backwards compatibility Form layer: - Update _get_module_bay_tree() to resolve {module} in positions during traversal, propagating parent positions through the tree - Extract validation into _validate_module_tokens() private method Tests: - Position inheritance at depth 2 and 3 - Custom separator (dot notation) - Multi-token backwards compatibility - Documentation for position inheritance Fixes: #19796 * Consolidate {module} placeholder logic into shared utilities and add API validation Extract get_module_bay_positions() and resolve_module_placeholder() into dcim/utils.py as shared routines used by the model, form, and API serializer. This eliminates duplicated traversal and resolution logic across three layers. Key changes: - Add position inheritance: {module} tokens in bay position fields resolve using the parent bay's position during hierarchy traversal - Single {module} token now resolves to the leaf bay's inherited position - Mismatched token count vs tree depth now raises ValueError instead of silently producing partial strings - API serializer validation uses shared utilities for parity with the form - Fix error message wording ("levels deep" instead of "in tree") --- docs/models/dcim/moduletype.md | 20 ++ netbox/dcim/api/serializers_/devices.py | 24 +- netbox/dcim/forms/common.py | 33 +-- .../dcim/models/device_component_templates.py | 40 ++- netbox/dcim/tests/test_models.py | 267 ++++++++++++++++++ netbox/dcim/utils.py | 53 ++++ 6 files changed, 368 insertions(+), 69 deletions(-) diff --git a/docs/models/dcim/moduletype.md b/docs/models/dcim/moduletype.md index 790e4a8de..dca2b4af4 100644 --- a/docs/models/dcim/moduletype.md +++ b/docs/models/dcim/moduletype.md @@ -32,6 +32,26 @@ For example, `{vc_position:1}` will render as `1` when no Virtual Chassis positi Automatic renaming is supported for all modular component types (those listed above). +### Position Inheritance for Nested Modules + +When using nested module bays (modules installed inside other modules), the `{module}` placeholder +can also be used in the **position** field of module bay templates to inherit the parent bay's +position. This allows a single module type to produce correctly named components at any nesting +depth, with a user-controlled separator. + +For example, a line card module type might define sub-bay positions as `{module}/1`, `{module}/2`, +etc. When the line card is installed in a device bay with position `3`, these sub-bay positions +resolve to `3/1`, `3/2`, etc. An SFP module type with interface template `SFP {module}` installed +in sub-bay `3/2` then produces interface `SFP 3/2`. + +The separator between levels is defined by the user in the position field template itself. Using +`{module}-1` produces positions like `3-1`, while `{module}.1` produces `3.1`. This provides +full flexibility without requiring a global separator configuration. + +!!! note + If the position field does not contain `{module}`, no inheritance occurs and behavior is + unchanged from previous versions. + ## Fields ### Manufacturer diff --git a/netbox/dcim/api/serializers_/devices.py b/netbox/dcim/api/serializers_/devices.py index 4da97ee78..f860c7879 100644 --- a/netbox/dcim/api/serializers_/devices.py +++ b/netbox/dcim/api/serializers_/devices.py @@ -8,6 +8,7 @@ from rest_framework import serializers from dcim.choices import * from dcim.constants import MACADDRESS_ASSIGNMENT_MODELS, MODULE_TOKEN from dcim.models import Device, DeviceBay, MACAddress, Module, VirtualDeviceContext +from dcim.utils import get_module_bay_positions, resolve_module_placeholder from extras.api.serializers_.configtemplates import ConfigTemplateSerializer from ipam.api.serializers_.ip import IPAddressSerializer from netbox.api.fields import ChoiceField, ContentTypeField, RelatedObjectCountField @@ -207,13 +208,7 @@ class ModuleSerializer(PrimaryModelSerializer): if not all([device, module_type, module_bay]): return data - # Build module bay tree for MODULE_TOKEN placeholder resolution (outermost to innermost) - module_bays = [] - current_bay = module_bay - while current_bay: - module_bays.append(current_bay) - current_bay = current_bay.module.module_bay if current_bay.module else None - module_bays.reverse() + positions = get_module_bay_positions(module_bay) for templates_attr, component_attr in [ ('consoleporttemplates', 'consoleports'), @@ -236,17 +231,10 @@ class ModuleSerializer(PrimaryModelSerializer): raise serializers.ValidationError( _("Cannot install module with placeholder values in a module bay with no position defined.") ) - if template.name.count(MODULE_TOKEN) != len(module_bays): - raise serializers.ValidationError( - _( - "Cannot install module with placeholder values in a module bay tree {level} in tree " - "but {tokens} placeholders given." - ).format( - level=len(module_bays), tokens=template.name.count(MODULE_TOKEN) - ) - ) - for bay in module_bays: - resolved_name = resolved_name.replace(MODULE_TOKEN, bay.position, 1) + try: + resolved_name = resolve_module_placeholder(template.name, positions) + except ValueError as e: + raise serializers.ValidationError(str(e)) existing_item = installed_components.get(resolved_name) diff --git a/netbox/dcim/forms/common.py b/netbox/dcim/forms/common.py index a3a781be5..f3df113b4 100644 --- a/netbox/dcim/forms/common.py +++ b/netbox/dcim/forms/common.py @@ -3,6 +3,7 @@ from django.utils.translation import gettext_lazy as _ from dcim.choices import * from dcim.constants import * +from dcim.utils import get_module_bay_positions, resolve_module_placeholder from utilities.forms import get_field_value __all__ = ( @@ -70,18 +71,6 @@ class InterfaceCommonForm(forms.Form): class ModuleCommonForm(forms.Form): - def _get_module_bay_tree(self, module_bay): - module_bays = [] - while module_bay: - module_bays.append(module_bay) - if module_bay.module: - module_bay = module_bay.module.module_bay - else: - module_bay = None - - module_bays.reverse() - return module_bays - def clean(self): super().clean() @@ -100,7 +89,7 @@ class ModuleCommonForm(forms.Form): self.instance._disable_replication = True return - module_bays = self._get_module_bay_tree(module_bay) + positions = get_module_bay_positions(module_bay) for templates, component_attribute in [ ("consoleporttemplates", "consoleports"), @@ -119,25 +108,15 @@ class ModuleCommonForm(forms.Form): # Get the templates for the module type. for template in getattr(module_type, templates).all(): resolved_name = template.name - # Installing modules with placeholders require that the bay has a position value if MODULE_TOKEN in template.name: if not module_bay.position: raise forms.ValidationError( _("Cannot install module with placeholder values in a module bay with no position defined.") ) - - if len(module_bays) != template.name.count(MODULE_TOKEN): - raise forms.ValidationError( - _( - "Cannot install module with placeholder values in a module bay tree {level} in tree " - "but {tokens} placeholders given." - ).format( - level=len(module_bays), tokens=template.name.count(MODULE_TOKEN) - ) - ) - - for module_bay in module_bays: - resolved_name = resolved_name.replace(MODULE_TOKEN, module_bay.position, 1) + try: + resolved_name = resolve_module_placeholder(template.name, positions) + except ValueError as e: + raise forms.ValidationError(str(e)) existing_item = installed_components.get(resolved_name) diff --git a/netbox/dcim/models/device_component_templates.py b/netbox/dcim/models/device_component_templates.py index 08bb6e952..fba5ce809 100644 --- a/netbox/dcim/models/device_component_templates.py +++ b/netbox/dcim/models/device_component_templates.py @@ -9,6 +9,7 @@ from dcim.choices import * from dcim.constants import * from dcim.models.base import PortMappingBase from dcim.models.mixins import InterfaceValidationMixin +from dcim.utils import get_module_bay_positions, resolve_module_placeholder from netbox.models import ChangeLoggedModel from utilities.fields import ColorField, NaturalOrderingField from utilities.mptt import TreeManager @@ -185,33 +186,27 @@ class ModularComponentTemplateModel(ComponentTemplateModel): return VC_POSITION_RE.sub(replacer, value) - def _get_module_tree(self, module): - modules = [] - while module: - modules.append(module) - if module.module_bay: - module = module.module_bay.module - else: - module = None - - modules.reverse() - return modules - - def _resolve_module_placeholder(self, value, module=None, device=None): - if MODULE_TOKEN in value and module: - modules = self._get_module_tree(module) - for m in modules: - value = value.replace(MODULE_TOKEN, m.module_bay.position, 1) - if VC_POSITION_RE.search(value) is not None: + def _resolve_all_placeholders(self, value, module=None, device=None): + has_module = MODULE_TOKEN in value + has_vc = VC_POSITION_RE.search(value) is not None + if not has_module and not has_vc: + return value + if has_module and module: + positions = get_module_bay_positions(module.module_bay) + value = resolve_module_placeholder(value, positions) + if has_vc: resolved_device = (module.device if module else None) or device value = self._resolve_vc_position(value, resolved_device) return value def resolve_name(self, module=None, device=None): - return self._resolve_module_placeholder(self.name, module, device) + return self._resolve_all_placeholders(self.name, module, device) def resolve_label(self, module=None, device=None): - return self._resolve_module_placeholder(self.label, module, device) + return self._resolve_all_placeholders(self.label, module, device) + + def resolve_position(self, module=None, device=None): + return self._resolve_all_placeholders(self.position, module, device) class ConsolePortTemplate(ModularComponentTemplateModel): @@ -745,14 +740,11 @@ class ModuleBayTemplate(ModularComponentTemplateModel): verbose_name = _('module bay template') verbose_name_plural = _('module bay templates') - def resolve_position(self, module): - return self._resolve_module_placeholder(self.position, module) - def instantiate(self, **kwargs): return self.component_model( name=self.resolve_name(kwargs.get('module'), kwargs.get('device')), label=self.resolve_label(kwargs.get('module'), kwargs.get('device')), - position=self.resolve_position(kwargs.get('module')), + position=self.resolve_position(kwargs.get('module'), kwargs.get('device')), enabled=self.enabled, **kwargs ) diff --git a/netbox/dcim/tests/test_models.py b/netbox/dcim/tests/test_models.py index 3bbc624f6..bfdaa5efe 100644 --- a/netbox/dcim/tests/test_models.py +++ b/netbox/dcim/tests/test_models.py @@ -999,6 +999,273 @@ class ModuleBayTestCase(TestCase): nested_bay = module.modulebays.get(name='Sub-bay 1-1') self.assertEqual(nested_bay.position, '1-1') + # + # Position inheritance tests (#19796) + # + + def test_position_inheritance_depth_2(self): + """ + A module bay with position '{module}/2' under a parent bay with position '1' + should resolve to position '1/2'. A single {module} in the interface template + should then resolve to '1/2'. + """ + manufacturer = Manufacturer.objects.first() + site = Site.objects.first() + device_role = DeviceRole.objects.first() + + device_type = DeviceType.objects.create( + manufacturer=manufacturer, + model='Chassis for Inheritance', + slug='chassis-for-inheritance' + ) + ModuleBayTemplate.objects.create( + device_type=device_type, + name='Line card slot 1', + position='1' + ) + + line_card_type = ModuleType.objects.create( + manufacturer=manufacturer, + model='Line Card with Inherited Bays' + ) + ModuleBayTemplate.objects.create( + module_type=line_card_type, + name='SFP bay {module}/1', + position='{module}/1' + ) + ModuleBayTemplate.objects.create( + module_type=line_card_type, + name='SFP bay {module}/2', + position='{module}/2' + ) + + sfp_type = ModuleType.objects.create( + manufacturer=manufacturer, + model='SFP with Inherited Path' + ) + InterfaceTemplate.objects.create( + module_type=sfp_type, + name='SFP {module}', + type=InterfaceTypeChoices.TYPE_10GE_SFP_PLUS + ) + + device = Device.objects.create( + name='Inheritance Chassis', + device_type=device_type, + role=device_role, + site=site + ) + + lc_bay = device.modulebays.get(name='Line card slot 1') + line_card = Module.objects.create( + device=device, + module_bay=lc_bay, + module_type=line_card_type + ) + + sfp_bay = line_card.modulebays.get(name='SFP bay 1/2') + sfp_module = Module.objects.create( + device=device, + module_bay=sfp_bay, + module_type=sfp_type + ) + + interface = sfp_module.interfaces.first() + self.assertEqual(interface.name, 'SFP 1/2') + + def test_position_inheritance_depth_3(self): + """ + Position inheritance at depth 3: positions should chain through the tree. + """ + manufacturer = Manufacturer.objects.first() + site = Site.objects.first() + device_role = DeviceRole.objects.first() + + device_type = DeviceType.objects.create( + manufacturer=manufacturer, + model='Deep Chassis', + slug='deep-chassis' + ) + ModuleBayTemplate.objects.create( + device_type=device_type, + name='Slot A', + position='A' + ) + + mid_type = ModuleType.objects.create( + manufacturer=manufacturer, + model='Mid Module' + ) + ModuleBayTemplate.objects.create( + module_type=mid_type, + name='Sub {module}-1', + position='{module}-1' + ) + + leaf_type = ModuleType.objects.create( + manufacturer=manufacturer, + model='Leaf Module' + ) + InterfaceTemplate.objects.create( + module_type=leaf_type, + name='Port {module}', + type=InterfaceTypeChoices.TYPE_1GE_FIXED + ) + + device = Device.objects.create( + name='Deep Device', + device_type=device_type, + role=device_role, + site=site + ) + + slot_a = device.modulebays.get(name='Slot A') + mid_module = Module.objects.create( + device=device, + module_bay=slot_a, + module_type=mid_type + ) + + sub_bay = mid_module.modulebays.get(name='Sub A-1') + self.assertEqual(sub_bay.position, 'A-1') + + leaf_module = Module.objects.create( + device=device, + module_bay=sub_bay, + module_type=leaf_type + ) + + interface = leaf_module.interfaces.first() + self.assertEqual(interface.name, 'Port A-1') + + def test_position_inheritance_custom_separator(self): + """ + Users control the separator through the position field template. + Using '.' instead of '/' should work correctly. + """ + manufacturer = Manufacturer.objects.first() + site = Site.objects.first() + device_role = DeviceRole.objects.first() + + device_type = DeviceType.objects.create( + manufacturer=manufacturer, + model='Dot Separator Chassis', + slug='dot-separator-chassis' + ) + ModuleBayTemplate.objects.create( + device_type=device_type, + name='Bay 1', + position='1' + ) + + card_type = ModuleType.objects.create( + manufacturer=manufacturer, + model='Card with Dot Separator' + ) + ModuleBayTemplate.objects.create( + module_type=card_type, + name='Port {module}.1', + position='{module}.1' + ) + + sfp_type = ModuleType.objects.create( + manufacturer=manufacturer, + model='SFP Dot' + ) + InterfaceTemplate.objects.create( + module_type=sfp_type, + name='eth{module}', + type=InterfaceTypeChoices.TYPE_10GE_SFP_PLUS + ) + + device = Device.objects.create( + name='Dot Device', + device_type=device_type, + role=device_role, + site=site + ) + + bay = device.modulebays.get(name='Bay 1') + card = Module.objects.create( + device=device, + module_bay=bay, + module_type=card_type + ) + + port_bay = card.modulebays.get(name='Port 1.1') + sfp = Module.objects.create( + device=device, + module_bay=port_bay, + module_type=sfp_type + ) + + interface = sfp.interfaces.first() + self.assertEqual(interface.name, 'eth1.1') + + def test_multi_token_backwards_compat(self): + """ + Multi-token {module}/{module} at matching depth should still resolve + level-by-level (backwards compatibility). + """ + manufacturer = Manufacturer.objects.first() + site = Site.objects.first() + device_role = DeviceRole.objects.first() + + device_type = DeviceType.objects.create( + manufacturer=manufacturer, + model='Multi Token Chassis', + slug='multi-token-chassis' + ) + ModuleBayTemplate.objects.create( + device_type=device_type, + name='Slot 1', + position='1' + ) + + card_type = ModuleType.objects.create( + manufacturer=manufacturer, + model='Card for Multi Token' + ) + ModuleBayTemplate.objects.create( + module_type=card_type, + name='Port 1', + position='2' + ) + + iface_type = ModuleType.objects.create( + manufacturer=manufacturer, + model='Interface Module Multi Token' + ) + InterfaceTemplate.objects.create( + module_type=iface_type, + name='Gi{module}/{module}', + type=InterfaceTypeChoices.TYPE_1GE_FIXED + ) + + device = Device.objects.create( + name='Multi Token Device', + device_type=device_type, + role=device_role, + site=site + ) + + slot = device.modulebays.get(name='Slot 1') + card = Module.objects.create( + device=device, + module_bay=slot, + module_type=card_type + ) + + port = card.modulebays.get(name='Port 1') + iface_module = Module.objects.create( + device=device, + module_bay=port, + module_type=iface_type + ) + + interface = iface_module.interfaces.first() + self.assertEqual(interface.name, 'Gi1/2') + @tag('regression') # #20912 def test_module_bay_parent_cleared_when_module_removed(self): """Test that the parent field is properly cleared when a module bay's module assignment is removed""" diff --git a/netbox/dcim/utils.py b/netbox/dcim/utils.py index 5dcc20035..ce4dd15ef 100644 --- a/netbox/dcim/utils.py +++ b/netbox/dcim/utils.py @@ -3,6 +3,59 @@ from collections import defaultdict from django.apps import apps from django.contrib.contenttypes.models import ContentType from django.db import router, transaction +from django.utils.translation import gettext as _ + +from dcim.constants import MODULE_TOKEN + + +def get_module_bay_positions(module_bay): + """ + Given a module bay, traverse up the module hierarchy and return + a list of bay position strings from root to leaf, resolving any + {module} tokens in each position using the parent position + (position inheritance). + """ + positions = [] + while module_bay: + pos = module_bay.position or '' + if positions and MODULE_TOKEN in pos: + pos = pos.replace(MODULE_TOKEN, positions[-1]) + positions.append(pos) + if module_bay.module: + module_bay = module_bay.module.module_bay + else: + module_bay = None + positions.reverse() + return positions + + +def resolve_module_placeholder(value, positions): + """ + Resolve {module} placeholder tokens in a string using the given + list of module bay positions (ordered root to leaf). + + A single {module} token resolves to the leaf (immediate parent) bay's position. + Multiple tokens must match the tree depth and resolve level-by-level. + + Returns the resolved string. + Raises ValueError if token count is greater than 1 and doesn't match tree depth. + """ + if MODULE_TOKEN not in value: + return value + + token_count = value.count(MODULE_TOKEN) + if token_count == 1: + return value.replace(MODULE_TOKEN, positions[-1]) + if token_count == len(positions): + for pos in positions: + value = value.replace(MODULE_TOKEN, pos, 1) + return value + raise ValueError( + _("Cannot install module with placeholder values in a module bay tree " + "{level} levels deep but {tokens} placeholders given.").format( + level=len(positions), tokens=token_count + ) + ) def compile_path_node(ct_id, object_id): From 5ad4e952078d7f44111fec248928ab8db966d6c8 Mon Sep 17 00:00:00 2001 From: Martin Hauser Date: Thu, 2 Apr 2026 18:42:06 +0200 Subject: [PATCH 059/104] Closes #21720: Improve validation of URLs containing HTTP basic authentication (#21822) Fixes #21720 --- netbox/utilities/validators.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/netbox/utilities/validators.py b/netbox/utilities/validators.py index 966bdf40f..47622d4d5 100644 --- a/netbox/utilities/validators.py +++ b/netbox/utilities/validators.py @@ -31,11 +31,11 @@ class EnhancedURLValidator(URLValidator): fqdn_re = URLValidator.hostname_re + URLValidator.domain_re + URLValidator.tld_re host_res = [URLValidator.ipv4_re, URLValidator.ipv6_re, fqdn_re, URLValidator.hostname_re] regex = _lazy_re_compile( - r'^(?:[a-z0-9\.\-\+]*)://' # Scheme (enforced separately) - r'(?:\S+(?::\S*)?@)?' # HTTP basic authentication - r'(?:' + '|'.join(host_res) + ')' # IPv4, IPv6, FQDN, or hostname - r'(?::\d{1,5})?' # Port number - r'(?:[/?#][^\s]*)?' # Path + r'^(?:[a-z0-9\.\-\+]*)://' # Scheme (enforced separately) + r'(?:[^\s:@/]+(?::[^\s:@/]*)?@)?' # HTTP basic authentication + r'(?:' + '|'.join(host_res) + ')' # IPv4, IPv6, FQDN, or hostname + r'(?::\d{1,5})?' # Port number + r'(?:[/?#][^\s]*)?' # Path r'\Z', re.IGNORECASE) schemes = None From 84502e80d0caa7ebbbe59833fdb7ef33087a8078 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 3 Apr 2026 16:22:18 -0400 Subject: [PATCH 060/104] Add SQL indexes for default ordering on applicable models --- netbox/circuits/models/circuits.py | 6 ++++++ netbox/circuits/models/virtual_circuits.py | 6 ++++++ netbox/core/models/config.py | 3 +++ netbox/core/models/jobs.py | 1 + netbox/dcim/models/device_component_templates.py | 3 +++ netbox/dcim/models/devices.py | 10 ++++++++++ netbox/dcim/models/modules.py | 3 +++ netbox/dcim/models/racks.py | 6 ++++++ netbox/extras/models/configs.py | 6 ++++++ netbox/extras/models/customfields.py | 3 +++ netbox/extras/models/models.py | 15 +++++++++++++++ netbox/extras/models/notifications.py | 2 ++ netbox/extras/models/scripts.py | 3 +++ netbox/extras/models/tags.py | 3 +++ netbox/ipam/models/fhrp.py | 4 ++++ netbox/ipam/models/ip.py | 7 +++++++ netbox/ipam/models/services.py | 1 + netbox/ipam/models/vlans.py | 3 +++ netbox/ipam/models/vrfs.py | 3 +++ netbox/tenancy/models/contacts.py | 4 ++++ netbox/users/models/permissions.py | 3 +++ netbox/users/models/tokens.py | 3 +++ netbox/virtualization/models/clusters.py | 3 +++ netbox/virtualization/models/virtualmachines.py | 6 ++++++ netbox/vpn/models/tunnels.py | 3 +++ netbox/wireless/models.py | 1 + 26 files changed, 111 insertions(+) diff --git a/netbox/circuits/models/circuits.py b/netbox/circuits/models/circuits.py index c4c6e0853..0e2d808c4 100644 --- a/netbox/circuits/models/circuits.py +++ b/netbox/circuits/models/circuits.py @@ -144,6 +144,9 @@ class Circuit(ContactsMixin, ImageAttachmentsMixin, DistanceMixin, PrimaryModel) name='%(app_label)s_%(class)s_unique_provideraccount_cid' ), ) + indexes = ( + models.Index(fields=('provider', 'provider_account', 'cid')), # Default ordering + ) verbose_name = _('circuit') verbose_name_plural = _('circuits') @@ -221,6 +224,9 @@ class CircuitGroupAssignment(CustomFieldsMixin, ExportTemplatesMixin, TagsMixin, name='%(app_label)s_%(class)s_unique_member_group' ), ) + indexes = ( + models.Index(fields=('group', 'member_type', 'member_id', 'priority', 'id')), # Default ordering + ) verbose_name = _('Circuit group assignment') verbose_name_plural = _('Circuit group assignments') diff --git a/netbox/circuits/models/virtual_circuits.py b/netbox/circuits/models/virtual_circuits.py index 30b2c6296..c1ace058f 100644 --- a/netbox/circuits/models/virtual_circuits.py +++ b/netbox/circuits/models/virtual_circuits.py @@ -97,6 +97,9 @@ class VirtualCircuit(ContactsMixin, PrimaryModel): name='%(app_label)s_%(class)s_unique_provideraccount_cid' ), ) + indexes = ( + models.Index(fields=('provider_network', 'provider_account', 'cid')), # Default ordering + ) verbose_name = _('virtual circuit') verbose_name_plural = _('virtual circuits') @@ -150,6 +153,9 @@ class VirtualCircuitTermination( class Meta: ordering = ['virtual_circuit', 'role', 'pk'] + indexes = ( + models.Index(fields=('virtual_circuit', 'role', 'id')), # Default ordering + ) verbose_name = _('virtual circuit termination') verbose_name_plural = _('virtual circuit terminations') diff --git a/netbox/core/models/config.py b/netbox/core/models/config.py index ac793d089..7ffadc667 100644 --- a/netbox/core/models/config.py +++ b/netbox/core/models/config.py @@ -37,6 +37,9 @@ class ConfigRevision(models.Model): class Meta: ordering = ['-created'] + indexes = ( + models.Index(fields=('-created',)), # Default ordering + ) verbose_name = _('config revision') verbose_name_plural = _('config revisions') constraints = [ diff --git a/netbox/core/models/jobs.py b/netbox/core/models/jobs.py index cc759c952..9dd838dac 100644 --- a/netbox/core/models/jobs.py +++ b/netbox/core/models/jobs.py @@ -133,6 +133,7 @@ class Job(models.Model): class Meta: ordering = ['-created'] indexes = ( + models.Index(fields=('-created',)), # Default ordering models.Index(fields=('object_type', 'object_id')), ) verbose_name = _('job') diff --git a/netbox/dcim/models/device_component_templates.py b/netbox/dcim/models/device_component_templates.py index 08bb6e952..3ab8bc87b 100644 --- a/netbox/dcim/models/device_component_templates.py +++ b/netbox/dcim/models/device_component_templates.py @@ -143,6 +143,9 @@ class ModularComponentTemplateModel(ComponentTemplateModel): name='%(app_label)s_%(class)s_unique_module_type_name' ), ) + indexes = ( + models.Index(fields=('device_type', 'module_type', 'name')), # Default ordering + ) def to_objectchange(self, action): objectchange = super().to_objectchange(action) diff --git a/netbox/dcim/models/devices.py b/netbox/dcim/models/devices.py index e205ac0c8..db9805600 100644 --- a/netbox/dcim/models/devices.py +++ b/netbox/dcim/models/devices.py @@ -737,6 +737,9 @@ class Device( class Meta: ordering = ('name', 'pk') # Name may be null + indexes = ( + models.Index(fields=('name', 'id')), # Default ordering + ) constraints = ( models.UniqueConstraint( Lower('name'), 'site', 'tenant', @@ -1184,6 +1187,9 @@ class VirtualChassis(PrimaryModel): class Meta: ordering = ['name'] + indexes = ( + models.Index(fields=('name',)), # Default ordering + ) verbose_name = _('virtual chassis') verbose_name_plural = _('virtual chassis') @@ -1290,6 +1296,9 @@ class VirtualDeviceContext(PrimaryModel): name='%(app_label)s_%(class)s_device_name' ), ) + indexes = ( + models.Index(fields=('name',)), # Default ordering + ) verbose_name = _('virtual device context') verbose_name_plural = _('virtual device contexts') @@ -1356,6 +1365,7 @@ class MACAddress(PrimaryModel): class Meta: ordering = ('mac_address', 'pk') indexes = ( + models.Index(fields=('mac_address', 'id')), # Default ordering models.Index(fields=('assigned_object_type', 'assigned_object_id')), ) verbose_name = _('MAC address') diff --git a/netbox/dcim/models/modules.py b/netbox/dcim/models/modules.py index 1a4645df3..24394c45d 100644 --- a/netbox/dcim/models/modules.py +++ b/netbox/dcim/models/modules.py @@ -113,6 +113,9 @@ class ModuleType(ImageAttachmentsMixin, PrimaryModel, WeightMixin): name='%(app_label)s_%(class)s_unique_manufacturer_model' ), ) + indexes = ( + models.Index(fields=('profile', 'manufacturer', 'model')), # Default ordering + ) verbose_name = _('module type') verbose_name_plural = _('module types') diff --git a/netbox/dcim/models/racks.py b/netbox/dcim/models/racks.py index 334235f32..7a226e0c6 100644 --- a/netbox/dcim/models/racks.py +++ b/netbox/dcim/models/racks.py @@ -390,6 +390,9 @@ class Rack(ContactsMixin, ImageAttachmentsMixin, TrackingModelMixin, RackBase): name='%(app_label)s_%(class)s_unique_location_facility_id' ), ) + indexes = ( + models.Index(fields=('site', 'location', 'name', 'id')), # Default ordering + ) verbose_name = _('rack') verbose_name_plural = _('racks') @@ -738,6 +741,9 @@ class RackReservation(PrimaryModel): class Meta: ordering = ['created', 'pk'] + indexes = ( + models.Index(fields=('created', 'id')), # Default ordering + ) verbose_name = _('rack reservation') verbose_name_plural = _('rack reservations') diff --git a/netbox/extras/models/configs.py b/netbox/extras/models/configs.py index 477fa2e03..235cf7160 100644 --- a/netbox/extras/models/configs.py +++ b/netbox/extras/models/configs.py @@ -176,6 +176,9 @@ class ConfigContext(SyncedDataMixin, CloningMixin, CustomLinksMixin, OwnerMixin, class Meta: ordering = ['weight', 'name'] + indexes = ( + models.Index(fields=('weight', 'name')), # Default ordering + ) verbose_name = _('config context') verbose_name_plural = _('config contexts') @@ -294,6 +297,9 @@ class ConfigTemplate( class Meta: ordering = ('name',) + indexes = ( + models.Index(fields=('name',)), # Default ordering + ) verbose_name = _('config template') verbose_name_plural = _('config templates') diff --git a/netbox/extras/models/customfields.py b/netbox/extras/models/customfields.py index 0250c5aa1..b9aba99a1 100644 --- a/netbox/extras/models/customfields.py +++ b/netbox/extras/models/customfields.py @@ -274,6 +274,9 @@ class CustomField(CloningMixin, ExportTemplatesMixin, OwnerMixin, ChangeLoggedMo class Meta: ordering = ['group_name', 'weight', 'name'] + indexes = ( + models.Index(fields=('group_name', 'weight', 'name')), # Default ordering + ) verbose_name = _('custom field') verbose_name_plural = _('custom fields') diff --git a/netbox/extras/models/models.py b/netbox/extras/models/models.py index 9a24a65d7..f7c5a0ca6 100644 --- a/netbox/extras/models/models.py +++ b/netbox/extras/models/models.py @@ -356,6 +356,9 @@ class CustomLink(CloningMixin, ExportTemplatesMixin, OwnerMixin, ChangeLoggedMod class Meta: ordering = ['group_name', 'weight', 'name'] + indexes = ( + models.Index(fields=('group_name', 'weight', 'name')), # Default ordering + ) verbose_name = _('custom link') verbose_name_plural = _('custom links') @@ -429,6 +432,9 @@ class ExportTemplate( class Meta: ordering = ('name',) + indexes = ( + models.Index(fields=('name',)), # Default ordering + ) verbose_name = _('export template') verbose_name_plural = _('export templates') @@ -515,6 +521,9 @@ class SavedFilter(CloningMixin, ExportTemplatesMixin, OwnerMixin, ChangeLoggedMo class Meta: ordering = ('weight', 'name') + indexes = ( + models.Index(fields=('weight', 'name')), # Default ordering + ) verbose_name = _('saved filter') verbose_name_plural = _('saved filters') @@ -597,6 +606,9 @@ class TableConfig(CloningMixin, ChangeLoggedModel): class Meta: ordering = ('weight', 'name') + indexes = ( + models.Index(fields=('weight', 'name')), # Default ordering + ) verbose_name = _('table config') verbose_name_plural = _('table configs') @@ -700,6 +712,7 @@ class ImageAttachment(ChangeLoggedModel): class Meta: ordering = ('name', 'pk') # name may be non-unique indexes = ( + models.Index(fields=('name', 'id')), # Default ordering models.Index(fields=('object_type', 'object_id')), ) verbose_name = _('image attachment') @@ -810,6 +823,7 @@ class JournalEntry(CustomFieldsMixin, CustomLinksMixin, TagsMixin, ExportTemplat class Meta: ordering = ('-created',) indexes = ( + models.Index(fields=('-created',)), # Default ordering models.Index(fields=('assigned_object_type', 'assigned_object_id')), ) verbose_name = _('journal entry') @@ -865,6 +879,7 @@ class Bookmark(models.Model): class Meta: ordering = ('created', 'pk') indexes = ( + models.Index(fields=('created', 'id')), # Default ordering models.Index(fields=('object_type', 'object_id')), ) constraints = ( diff --git a/netbox/extras/models/notifications.py b/netbox/extras/models/notifications.py index f813a0d29..c2e30c697 100644 --- a/netbox/extras/models/notifications.py +++ b/netbox/extras/models/notifications.py @@ -73,6 +73,7 @@ class Notification(models.Model): class Meta: ordering = ('-created', 'pk') indexes = ( + models.Index(fields=('-created', 'id')), # Default ordering models.Index(fields=('object_type', 'object_id')), ) constraints = ( @@ -215,6 +216,7 @@ class Subscription(models.Model): class Meta: ordering = ('-created', 'user') indexes = ( + models.Index(fields=('-created', 'user')), # Default ordering models.Index(fields=('object_type', 'object_id')), ) constraints = ( diff --git a/netbox/extras/models/scripts.py b/netbox/extras/models/scripts.py index f8c74671a..6383c98f1 100644 --- a/netbox/extras/models/scripts.py +++ b/netbox/extras/models/scripts.py @@ -62,6 +62,9 @@ class Script(EventRulesMixin, JobsMixin): name='extras_script_unique_name_module' ), ) + indexes = ( + models.Index(fields=('module', 'name')), # Default ordering + ) verbose_name = _('script') verbose_name_plural = _('scripts') diff --git a/netbox/extras/models/tags.py b/netbox/extras/models/tags.py index 1fdb48462..f04b2e3cc 100644 --- a/netbox/extras/models/tags.py +++ b/netbox/extras/models/tags.py @@ -52,6 +52,9 @@ class Tag(CloningMixin, ExportTemplatesMixin, OwnerMixin, ChangeLoggedModel, Tag class Meta: ordering = ('weight', 'name') + indexes = ( + models.Index(fields=('weight', 'name')), # Default ordering + ) verbose_name = _('tag') verbose_name_plural = _('tags') diff --git a/netbox/ipam/models/fhrp.py b/netbox/ipam/models/fhrp.py index 63a04d4d1..e34ad12bf 100644 --- a/netbox/ipam/models/fhrp.py +++ b/netbox/ipam/models/fhrp.py @@ -59,6 +59,9 @@ class FHRPGroup(PrimaryModel): class Meta: ordering = ['protocol', 'group_id', 'pk'] + indexes = ( + models.Index(fields=('protocol', 'group_id', 'id')), # Default ordering + ) verbose_name = _('FHRP group') verbose_name_plural = _('FHRP groups') @@ -105,6 +108,7 @@ class FHRPGroupAssignment(ChangeLoggedModel): class Meta: ordering = ('-priority', 'pk') indexes = ( + models.Index(fields=('-priority', 'id')), # Default ordering models.Index(fields=('interface_type', 'interface_id')), ) constraints = ( diff --git a/netbox/ipam/models/ip.py b/netbox/ipam/models/ip.py index 5d11622f6..a776aa9b3 100644 --- a/netbox/ipam/models/ip.py +++ b/netbox/ipam/models/ip.py @@ -110,6 +110,9 @@ class Aggregate(ContactsMixin, GetAvailablePrefixesMixin, PrimaryModel): class Meta: ordering = ('prefix', 'pk') # prefix may be non-unique + indexes = ( + models.Index(fields=('prefix', 'id')), # Default ordering + ) verbose_name = _('aggregate') verbose_name_plural = _('aggregates') @@ -200,6 +203,9 @@ class Role(OrganizationalModel): class Meta: ordering = ('weight', 'name') + indexes = ( + models.Index(fields=('weight', 'name')), # Default ordering + ) verbose_name = _('role') verbose_name_plural = _('roles') @@ -833,6 +839,7 @@ class IPAddress(ContactsMixin, PrimaryModel): class Meta: ordering = ('address', 'pk') # address may be non-unique indexes = ( + models.Index(fields=('address', 'id')), # Default ordering models.Index(Cast(Host('address'), output_field=IPAddressField()), name='ipam_ipaddress_host'), models.Index(fields=('assigned_object_type', 'assigned_object_id')), ) diff --git a/netbox/ipam/models/services.py b/netbox/ipam/models/services.py index 74504c5dc..d934465c3 100644 --- a/netbox/ipam/models/services.py +++ b/netbox/ipam/models/services.py @@ -93,6 +93,7 @@ class Service(ContactsMixin, ServiceBase, PrimaryModel): class Meta: indexes = ( + models.Index(fields=('protocol', 'ports', 'id')), # Default ordering models.Index(fields=('parent_object_type', 'parent_object_id')), ) ordering = ('protocol', 'ports', 'pk') # (protocol, port) may be non-unique diff --git a/netbox/ipam/models/vlans.py b/netbox/ipam/models/vlans.py index dea94743a..44ce3911e 100644 --- a/netbox/ipam/models/vlans.py +++ b/netbox/ipam/models/vlans.py @@ -267,6 +267,9 @@ class VLAN(PrimaryModel): class Meta: ordering = ('site', 'group', 'vid', 'pk') # (site, group, vid) may be non-unique + indexes = ( + models.Index(fields=('site', 'group', 'vid', 'id')), # Default ordering + ) constraints = ( models.UniqueConstraint( fields=('group', 'vid'), diff --git a/netbox/ipam/models/vrfs.py b/netbox/ipam/models/vrfs.py index 60ad760f9..d91fa02a4 100644 --- a/netbox/ipam/models/vrfs.py +++ b/netbox/ipam/models/vrfs.py @@ -58,6 +58,9 @@ class VRF(PrimaryModel): class Meta: ordering = ('name', 'rd', 'pk') # (name, rd) may be non-unique + indexes = ( + models.Index(fields=('name', 'rd', 'id')), # Default ordering + ) verbose_name = _('VRF') verbose_name_plural = _('VRFs') diff --git a/netbox/tenancy/models/contacts.py b/netbox/tenancy/models/contacts.py index f744ea935..a08e89f0f 100644 --- a/netbox/tenancy/models/contacts.py +++ b/netbox/tenancy/models/contacts.py @@ -90,6 +90,9 @@ class Contact(PrimaryModel): class Meta: ordering = ['name'] + indexes = ( + models.Index(fields=('name',)), # Default ordering + ) verbose_name = _('contact') verbose_name_plural = _('contacts') @@ -130,6 +133,7 @@ class ContactAssignment(CustomFieldsMixin, ExportTemplatesMixin, TagsMixin, Chan class Meta: ordering = ('contact', 'priority', 'role', 'pk') indexes = ( + models.Index(fields=('contact', 'priority', 'role', 'id')), # Default ordering models.Index(fields=('object_type', 'object_id')), ) constraints = ( diff --git a/netbox/users/models/permissions.py b/netbox/users/models/permissions.py index 3e41d4356..3bd373ce3 100644 --- a/netbox/users/models/permissions.py +++ b/netbox/users/models/permissions.py @@ -52,6 +52,9 @@ class ObjectPermission(CloningMixin, models.Model): class Meta: ordering = ['name'] + indexes = ( + models.Index(fields=('name',)), # Default ordering + ) verbose_name = _('permission') verbose_name_plural = _('permissions') diff --git a/netbox/users/models/tokens.py b/netbox/users/models/tokens.py index 8bdab2142..b47064c84 100644 --- a/netbox/users/models/tokens.py +++ b/netbox/users/models/tokens.py @@ -117,6 +117,9 @@ class Token(models.Model): class Meta: ordering = ('-created',) + indexes = ( + models.Index(fields=('-created',)), # Default ordering + ) verbose_name = _('token') verbose_name_plural = _('tokens') constraints = [ diff --git a/netbox/virtualization/models/clusters.py b/netbox/virtualization/models/clusters.py index 1b79305dc..c07dd6e6d 100644 --- a/netbox/virtualization/models/clusters.py +++ b/netbox/virtualization/models/clusters.py @@ -97,6 +97,9 @@ class Cluster(ContactsMixin, CachedScopeMixin, PrimaryModel): class Meta: ordering = ['name'] + indexes = ( + models.Index(fields=('name',)), # Default ordering + ) constraints = ( models.UniqueConstraint( fields=('group', 'name'), diff --git a/netbox/virtualization/models/virtualmachines.py b/netbox/virtualization/models/virtualmachines.py index 8314c8904..1893bbc7b 100644 --- a/netbox/virtualization/models/virtualmachines.py +++ b/netbox/virtualization/models/virtualmachines.py @@ -92,6 +92,9 @@ class VirtualMachineType(ImageAttachmentsMixin, PrimaryModel): violation_error_message=_('Virtual machine type slug must be unique.'), ), ) + indexes = ( + models.Index(fields=('name',)), # Default ordering + ) verbose_name = _('virtual machine type') verbose_name_plural = _('virtual machine types') @@ -249,6 +252,9 @@ class VirtualMachine( class Meta: ordering = ('name', 'pk') # Name may be non-unique + indexes = ( + models.Index(fields=('name', 'id')), # Default ordering + ) constraints = ( models.UniqueConstraint( Lower('name'), 'cluster', 'tenant', diff --git a/netbox/vpn/models/tunnels.py b/netbox/vpn/models/tunnels.py index a25036789..76ea76327 100644 --- a/netbox/vpn/models/tunnels.py +++ b/netbox/vpn/models/tunnels.py @@ -145,6 +145,9 @@ class TunnelTermination(CustomFieldsMixin, CustomLinksMixin, TagsMixin, ChangeLo violation_error_message=_("An object may be terminated to only one tunnel at a time.") ), ) + indexes = ( + models.Index(fields=('tunnel', 'role', 'id')), # Default ordering + ) verbose_name = _('tunnel termination') verbose_name_plural = _('tunnel terminations') diff --git a/netbox/wireless/models.py b/netbox/wireless/models.py index 35e5bb9dc..f212fb6dc 100644 --- a/netbox/wireless/models.py +++ b/netbox/wireless/models.py @@ -118,6 +118,7 @@ class WirelessLAN(WirelessAuthenticationBase, CachedScopeMixin, PrimaryModel): class Meta: ordering = ('ssid', 'pk') indexes = ( + models.Index(fields=('ssid', 'id')), # Default ordering models.Index(fields=('scope_type', 'scope_id')), ) verbose_name = _('wireless LAN') From 2b1f4ab51abe4b45763b1e5937d5b7584305233f Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 3 Apr 2026 16:32:08 -0400 Subject: [PATCH 061/104] Add migration files for indexes --- .../0057_default_ordering_indexes.py | 35 +++++++++ .../0022_default_ordering_indexes.py | 21 +++++ .../0231_default_ordering_indexes.py | 78 +++++++++++++++++++ .../0137_default_ordering_indexes.py | 74 ++++++++++++++++++ .../0089_default_ordering_indexes.py | 47 +++++++++++ .../0024_default_ordering_indexes.py | 21 +++++ .../0016_default_ordering_indexes.py | 19 +++++ .../0055_default_ordering_indexes.py | 23 ++++++ .../0012_default_ordering_indexes.py | 17 ++++ .../0019_default_ordering_indexes.py | 20 +++++ 10 files changed, 355 insertions(+) create mode 100644 netbox/circuits/migrations/0057_default_ordering_indexes.py create mode 100644 netbox/core/migrations/0022_default_ordering_indexes.py create mode 100644 netbox/dcim/migrations/0231_default_ordering_indexes.py create mode 100644 netbox/extras/migrations/0137_default_ordering_indexes.py create mode 100644 netbox/ipam/migrations/0089_default_ordering_indexes.py create mode 100644 netbox/tenancy/migrations/0024_default_ordering_indexes.py create mode 100644 netbox/users/migrations/0016_default_ordering_indexes.py create mode 100644 netbox/virtualization/migrations/0055_default_ordering_indexes.py create mode 100644 netbox/vpn/migrations/0012_default_ordering_indexes.py create mode 100644 netbox/wireless/migrations/0019_default_ordering_indexes.py diff --git a/netbox/circuits/migrations/0057_default_ordering_indexes.py b/netbox/circuits/migrations/0057_default_ordering_indexes.py new file mode 100644 index 000000000..256983f22 --- /dev/null +++ b/netbox/circuits/migrations/0057_default_ordering_indexes.py @@ -0,0 +1,35 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ('circuits', '0056_gfk_indexes'), + ('contenttypes', '0002_remove_content_type_name'), + ('dcim', '0230_interface_rf_channel_frequency_precision'), + ('extras', '0136_customfield_validation_schema'), + ('tenancy', '0023_add_mptt_tree_indexes'), + ('users', '0015_owner'), + ] + + operations = [ + migrations.AddIndex( + model_name='circuit', + index=models.Index(fields=['provider', 'provider_account', 'cid'], name='circuits_ci_provide_a0c42c_idx'), + ), + migrations.AddIndex( + model_name='circuitgroupassignment', + index=models.Index( + fields=['group', 'member_type', 'member_id', 'priority', 'id'], name='circuits_ci_group_i_2f8327_idx' + ), + ), + migrations.AddIndex( + model_name='virtualcircuit', + index=models.Index( + fields=['provider_network', 'provider_account', 'cid'], name='circuits_vi_provide_989efa_idx' + ), + ), + migrations.AddIndex( + model_name='virtualcircuittermination', + index=models.Index(fields=['virtual_circuit', 'role', 'id'], name='circuits_vi_virtual_4b5c0c_idx'), + ), + ] diff --git a/netbox/core/migrations/0022_default_ordering_indexes.py b/netbox/core/migrations/0022_default_ordering_indexes.py new file mode 100644 index 000000000..3c62d0c19 --- /dev/null +++ b/netbox/core/migrations/0022_default_ordering_indexes.py @@ -0,0 +1,21 @@ +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('core', '0021_job_queue_name'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AddIndex( + model_name='configrevision', + index=models.Index(fields=['-created'], name='core_config_created_ef9552_idx'), + ), + migrations.AddIndex( + model_name='job', + index=models.Index(fields=['-created'], name='core_job_created_efa7cb_idx'), + ), + ] diff --git a/netbox/dcim/migrations/0231_default_ordering_indexes.py b/netbox/dcim/migrations/0231_default_ordering_indexes.py new file mode 100644 index 000000000..71d0953a0 --- /dev/null +++ b/netbox/dcim/migrations/0231_default_ordering_indexes.py @@ -0,0 +1,78 @@ +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('dcim', '0230_interface_rf_channel_frequency_precision'), + ('extras', '0136_customfield_validation_schema'), + ('ipam', '0088_rename_vlangroup_total_vlan_ids'), + ('tenancy', '0023_add_mptt_tree_indexes'), + ('users', '0015_owner'), + ('virtualization', '0054_virtualmachinetype'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AddIndex( + model_name='consoleporttemplate', + index=models.Index(fields=['device_type', 'module_type', 'name'], name='dcim_consol_device__101ed5_idx'), + ), + migrations.AddIndex( + model_name='consoleserverporttemplate', + index=models.Index(fields=['device_type', 'module_type', 'name'], name='dcim_consol_device__a901e6_idx'), + ), + migrations.AddIndex( + model_name='device', + index=models.Index(fields=['name', 'id'], name='dcim_device_name_c27913_idx'), + ), + migrations.AddIndex( + model_name='frontporttemplate', + index=models.Index(fields=['device_type', 'module_type', 'name'], name='dcim_frontp_device__ec2ffb_idx'), + ), + migrations.AddIndex( + model_name='interfacetemplate', + index=models.Index(fields=['device_type', 'module_type', 'name'], name='dcim_interf_device__601012_idx'), + ), + migrations.AddIndex( + model_name='macaddress', + index=models.Index(fields=['mac_address', 'id'], name='dcim_macadd_mac_add_f2662a_idx'), + ), + migrations.AddIndex( + model_name='modulebaytemplate', + index=models.Index(fields=['device_type', 'module_type', 'name'], name='dcim_module_device__9eabad_idx'), + ), + migrations.AddIndex( + model_name='moduletype', + index=models.Index(fields=['profile', 'manufacturer', 'model'], name='dcim_module_profile_868277_idx'), + ), + migrations.AddIndex( + model_name='poweroutlettemplate', + index=models.Index(fields=['device_type', 'module_type', 'name'], name='dcim_powero_device__b83a8f_idx'), + ), + migrations.AddIndex( + model_name='powerporttemplate', + index=models.Index(fields=['device_type', 'module_type', 'name'], name='dcim_powerp_device__6c25da_idx'), + ), + migrations.AddIndex( + model_name='rack', + index=models.Index(fields=['site', 'location', 'name', 'id'], name='dcim_rack_site_id_715040_idx'), + ), + migrations.AddIndex( + model_name='rackreservation', + index=models.Index(fields=['created', 'id'], name='dcim_rackre_created_84f02e_idx'), + ), + migrations.AddIndex( + model_name='rearporttemplate', + index=models.Index(fields=['device_type', 'module_type', 'name'], name='dcim_rearpo_device__27f194_idx'), + ), + migrations.AddIndex( + model_name='virtualchassis', + index=models.Index(fields=['name'], name='dcim_virtua_name_2dc5cd_idx'), + ), + migrations.AddIndex( + model_name='virtualdevicecontext', + index=models.Index(fields=['name'], name='dcim_virtua_name_079d4d_idx'), + ), + ] diff --git a/netbox/extras/migrations/0137_default_ordering_indexes.py b/netbox/extras/migrations/0137_default_ordering_indexes.py new file mode 100644 index 000000000..2407e7868 --- /dev/null +++ b/netbox/extras/migrations/0137_default_ordering_indexes.py @@ -0,0 +1,74 @@ +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('core', '0022_default_ordering_indexes'), + ('dcim', '0231_default_ordering_indexes'), + ('extras', '0136_customfield_validation_schema'), + ('tenancy', '0023_add_mptt_tree_indexes'), + ('users', '0015_owner'), + ('virtualization', '0054_virtualmachinetype'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AddIndex( + model_name='bookmark', + index=models.Index(fields=['created', 'id'], name='extras_book_created_1cb4a5_idx'), + ), + migrations.AddIndex( + model_name='configcontext', + index=models.Index(fields=['weight', 'name'], name='extras_conf_weight_ef9a81_idx'), + ), + migrations.AddIndex( + model_name='configtemplate', + index=models.Index(fields=['name'], name='extras_conf_name_e276bf_idx'), + ), + migrations.AddIndex( + model_name='customfield', + index=models.Index(fields=['group_name', 'weight', 'name'], name='extras_cust_group_n_40cb93_idx'), + ), + migrations.AddIndex( + model_name='customlink', + index=models.Index(fields=['group_name', 'weight', 'name'], name='extras_cust_group_n_5a8be0_idx'), + ), + migrations.AddIndex( + model_name='exporttemplate', + index=models.Index(fields=['name'], name='extras_expo_name_55a9af_idx'), + ), + migrations.AddIndex( + model_name='imageattachment', + index=models.Index(fields=['name', 'id'], name='extras_imag_name_23cd9f_idx'), + ), + migrations.AddIndex( + model_name='journalentry', + index=models.Index(fields=['-created'], name='extras_jour_created_ec0fac_idx'), + ), + migrations.AddIndex( + model_name='notification', + index=models.Index(fields=['-created', 'id'], name='extras_noti_created_1d5146_idx'), + ), + migrations.AddIndex( + model_name='savedfilter', + index=models.Index(fields=['weight', 'name'], name='extras_save_weight_c070c4_idx'), + ), + migrations.AddIndex( + model_name='script', + index=models.Index(fields=['module', 'name'], name='extras_scri_module__8bd99c_idx'), + ), + migrations.AddIndex( + model_name='subscription', + index=models.Index(fields=['-created', 'user'], name='extras_subs_created_034618_idx'), + ), + migrations.AddIndex( + model_name='tableconfig', + index=models.Index(fields=['weight', 'name'], name='extras_tabl_weight_7c4bb6_idx'), + ), + migrations.AddIndex( + model_name='tag', + index=models.Index(fields=['weight', 'name'], name='extras_tag_weight_d99f50_idx'), + ), + ] diff --git a/netbox/ipam/migrations/0089_default_ordering_indexes.py b/netbox/ipam/migrations/0089_default_ordering_indexes.py new file mode 100644 index 000000000..9407fbce1 --- /dev/null +++ b/netbox/ipam/migrations/0089_default_ordering_indexes.py @@ -0,0 +1,47 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('dcim', '0231_default_ordering_indexes'), + ('extras', '0137_default_ordering_indexes'), + ('ipam', '0088_rename_vlangroup_total_vlan_ids'), + ('tenancy', '0023_add_mptt_tree_indexes'), + ('users', '0015_owner'), + ] + + operations = [ + migrations.AddIndex( + model_name='aggregate', + index=models.Index(fields=['prefix', 'id'], name='ipam_aggreg_prefix_89dd71_idx'), + ), + migrations.AddIndex( + model_name='fhrpgroup', + index=models.Index(fields=['protocol', 'group_id', 'id'], name='ipam_fhrpgr_protoco_0445ae_idx'), + ), + migrations.AddIndex( + model_name='fhrpgroupassignment', + index=models.Index(fields=['-priority', 'id'], name='ipam_fhrpgr_priorit_b76335_idx'), + ), + migrations.AddIndex( + model_name='ipaddress', + index=models.Index(fields=['address', 'id'], name='ipam_ipaddr_address_3ddeea_idx'), + ), + migrations.AddIndex( + model_name='role', + index=models.Index(fields=['weight', 'name'], name='ipam_role_weight_01396b_idx'), + ), + migrations.AddIndex( + model_name='service', + index=models.Index(fields=['protocol', 'ports', 'id'], name='ipam_servic_protoco_687d13_idx'), + ), + migrations.AddIndex( + model_name='vlan', + index=models.Index(fields=['site', 'group', 'vid', 'id'], name='ipam_vlan_site_id_985573_idx'), + ), + migrations.AddIndex( + model_name='vrf', + index=models.Index(fields=['name', 'rd', 'id'], name='ipam_vrf_name_ec911d_idx'), + ), + ] diff --git a/netbox/tenancy/migrations/0024_default_ordering_indexes.py b/netbox/tenancy/migrations/0024_default_ordering_indexes.py new file mode 100644 index 000000000..1d3a0dbb1 --- /dev/null +++ b/netbox/tenancy/migrations/0024_default_ordering_indexes.py @@ -0,0 +1,21 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('extras', '0137_default_ordering_indexes'), + ('tenancy', '0023_add_mptt_tree_indexes'), + ('users', '0015_owner'), + ] + + operations = [ + migrations.AddIndex( + model_name='contact', + index=models.Index(fields=['name'], name='tenancy_con_name_c26153_idx'), + ), + migrations.AddIndex( + model_name='contactassignment', + index=models.Index(fields=['contact', 'priority', 'role', 'id'], name='tenancy_con_contact_23011f_idx'), + ), + ] diff --git a/netbox/users/migrations/0016_default_ordering_indexes.py b/netbox/users/migrations/0016_default_ordering_indexes.py new file mode 100644 index 000000000..bf5be5357 --- /dev/null +++ b/netbox/users/migrations/0016_default_ordering_indexes.py @@ -0,0 +1,19 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('users', '0015_owner'), + ] + + operations = [ + migrations.AddIndex( + model_name='objectpermission', + index=models.Index(fields=['name'], name='users_objec_name_ca707b_idx'), + ), + migrations.AddIndex( + model_name='token', + index=models.Index(fields=['-created'], name='users_token_created_1467b4_idx'), + ), + ] diff --git a/netbox/virtualization/migrations/0055_default_ordering_indexes.py b/netbox/virtualization/migrations/0055_default_ordering_indexes.py new file mode 100644 index 000000000..f3e1d5236 --- /dev/null +++ b/netbox/virtualization/migrations/0055_default_ordering_indexes.py @@ -0,0 +1,23 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ('dcim', '0231_default_ordering_indexes'), + ('extras', '0137_default_ordering_indexes'), + ('ipam', '0089_default_ordering_indexes'), + ('tenancy', '0024_default_ordering_indexes'), + ('users', '0016_default_ordering_indexes'), + ('virtualization', '0054_virtualmachinetype'), + ] + + operations = [ + migrations.AddIndex( + model_name='virtualmachine', + index=models.Index(fields=['name', 'id'], name='virtualizat_name_16033e_idx'), + ), + migrations.AddIndex( + model_name='virtualmachinetype', + index=models.Index(fields=['name'], name='virtualizat_name_6cff11_idx'), + ), + ] diff --git a/netbox/vpn/migrations/0012_default_ordering_indexes.py b/netbox/vpn/migrations/0012_default_ordering_indexes.py new file mode 100644 index 000000000..88180faa7 --- /dev/null +++ b/netbox/vpn/migrations/0012_default_ordering_indexes.py @@ -0,0 +1,17 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('extras', '0137_default_ordering_indexes'), + ('ipam', '0089_default_ordering_indexes'), + ('vpn', '0011_add_comments_to_organizationalmodel'), + ] + + operations = [ + migrations.AddIndex( + model_name='tunneltermination', + index=models.Index(fields=['tunnel', 'role', 'id'], name='vpn_tunnelt_tunnel__f542d3_idx'), + ), + ] diff --git a/netbox/wireless/migrations/0019_default_ordering_indexes.py b/netbox/wireless/migrations/0019_default_ordering_indexes.py new file mode 100644 index 000000000..cddfa0a8d --- /dev/null +++ b/netbox/wireless/migrations/0019_default_ordering_indexes.py @@ -0,0 +1,20 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('dcim', '0231_default_ordering_indexes'), + ('extras', '0137_default_ordering_indexes'), + ('ipam', '0089_default_ordering_indexes'), + ('tenancy', '0024_default_ordering_indexes'), + ('users', '0016_default_ordering_indexes'), + ('wireless', '0018_add_mptt_tree_indexes'), + ] + + operations = [ + migrations.AddIndex( + model_name='wirelesslan', + index=models.Index(fields=['ssid', 'id'], name='wireless_wi_ssid_64a9ce_idx'), + ), + ] From d630afaf149a8b457751d48c5b76becbb8cbcaff Mon Sep 17 00:00:00 2001 From: Martin Hauser Date: Mon, 6 Apr 2026 20:15:02 +0200 Subject: [PATCH 062/104] feat(ipam): Add changelog message support to bulk Prefix/IP creation Extend bulk add forms for Prefix and IPAddress to support changelog messages. Switch IPAddressBulkAddForm to PrimaryModelForm base, update field ordering, consolidate template rendering, and add test coverage. Fixes #21780 --- netbox/ipam/forms/model_forms.py | 5 +- netbox/ipam/tests/test_views.py | 67 ++++++++++++++++++++++- netbox/netbox/views/generic/bulk_views.py | 1 + netbox/templates/generic/bulk_add.html | 29 ++-------- netbox/templates/htmx/bulk_add_form.html | 23 +------- 5 files changed, 77 insertions(+), 48 deletions(-) diff --git a/netbox/ipam/forms/model_forms.py b/netbox/ipam/forms/model_forms.py index c8c488329..bffe7a1eb 100644 --- a/netbox/ipam/forms/model_forms.py +++ b/netbox/ipam/forms/model_forms.py @@ -483,7 +483,7 @@ class IPAddressForm(TenancyForm, PrimaryModelForm): return ipaddress -class IPAddressBulkAddForm(TenancyForm, NetBoxModelForm): +class IPAddressBulkAddForm(TenancyForm, PrimaryModelForm): vrf = DynamicModelChoiceField( queryset=VRF.objects.all(), required=False, @@ -498,7 +498,8 @@ class IPAddressBulkAddForm(TenancyForm, NetBoxModelForm): class Meta: model = IPAddress fields = [ - 'address', 'vrf', 'status', 'role', 'dns_name', 'description', 'tenant_group', 'tenant', 'tags', + 'address', 'vrf', 'status', 'role', 'dns_name', 'tenant_group', 'tenant', 'description', 'owner', + 'comments', 'tags', ] diff --git a/netbox/ipam/tests/test_views.py b/netbox/ipam/tests/test_views.py index 74def845f..e77d88b68 100644 --- a/netbox/ipam/tests/test_views.py +++ b/netbox/ipam/tests/test_views.py @@ -5,7 +5,8 @@ from django.test import override_settings from django.urls import reverse from netaddr import IPNetwork -from core.models import ObjectType +from core.choices import ObjectChangeActionChoices +from core.models import ObjectChange, ObjectType from dcim.constants import InterfaceTypeChoices from dcim.models import Device, DeviceRole, DeviceType, Interface, Manufacturer, Site from ipam.choices import * @@ -543,6 +544,37 @@ class PrefixTestCase(ViewTestCases.PrimaryObjectViewTestCase): f'Expected prefix {prefix_str} was not created' ) + @override_settings(EXEMPT_VIEW_PERMISSIONS=['*']) + def test_bulk_add_prefixes_with_changelog_message(self): + obj_perm = ObjectPermission(name='Test permission', actions=['add']) + obj_perm.save() + obj_perm.users.add(self.user) + obj_perm.object_types.add(ObjectType.objects.get_for_model(Prefix)) + + changelog_message = 'Bulk-created prefixes' + prefixes = [IPNetwork(f'198.18.{i}.0/24') for i in range(3)] + url = reverse('ipam:prefix_bulk_add') + data = { + 'pattern': '198.18.[0-2].0/24', + 'status': PrefixStatusChoices.STATUS_ACTIVE, + 'changelog_message': changelog_message, + } + + response = self.client.post(url, data) + self.assertHttpStatus(response, 302) + + created_prefixes = list(Prefix.objects.filter(prefix__in=prefixes)) + self.assertEqual(len(created_prefixes), len(prefixes)) + + objectchanges = ObjectChange.objects.filter( + action=ObjectChangeActionChoices.ACTION_CREATE, + changed_object_type=ContentType.objects.get_for_model(Prefix), + changed_object_id__in=[obj.pk for obj in created_prefixes], + ) + self.assertEqual(objectchanges.count(), len(prefixes)) + for objectchange in objectchanges: + self.assertEqual(objectchange.message, changelog_message) + @override_settings(EXEMPT_VIEW_PERMISSIONS=['*']) def test_prefix_prefixes(self): prefixes = ( @@ -908,6 +940,39 @@ class IPAddressTestCase(ViewTestCases.PrimaryObjectViewTestCase): 'description': 'New description', } + @override_settings(EXEMPT_VIEW_PERMISSIONS=['*']) + def test_bulk_add_ipaddresses_with_changelog_message(self): + obj_perm = ObjectPermission(name='Test permission', actions=['add']) + obj_perm.save() + obj_perm.users.add(self.user) + obj_perm.object_types.add(ObjectType.objects.get_for_model(IPAddress)) + + vrf = VRF.objects.get(name='VRF 1') + changelog_message = 'Bulk-created IP addresses' + addresses = [IPNetwork(f'198.51.100.{i}/24') for i in range(10, 13)] + url = reverse('ipam:ipaddress_bulk_add') + data = { + 'pattern': '198.51.100.[10-12]/24', + 'vrf': vrf.pk, + 'status': IPAddressStatusChoices.STATUS_ACTIVE, + 'changelog_message': changelog_message, + } + + response = self.client.post(url, data) + self.assertHttpStatus(response, 302) + + created_addresses = list(IPAddress.objects.filter(address__in=addresses, vrf=vrf)) + self.assertEqual(len(created_addresses), len(addresses)) + + objectchanges = ObjectChange.objects.filter( + action=ObjectChangeActionChoices.ACTION_CREATE, + changed_object_type=ContentType.objects.get_for_model(IPAddress), + changed_object_id__in=[obj.pk for obj in created_addresses], + ) + self.assertEqual(objectchanges.count(), len(addresses)) + for objectchange in objectchanges: + self.assertEqual(objectchange.message, changelog_message) + class FHRPGroupTestCase(ViewTestCases.PrimaryObjectViewTestCase): model = FHRPGroup diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py index ce2efdf08..e75f7c4db 100644 --- a/netbox/netbox/views/generic/bulk_views.py +++ b/netbox/netbox/views/generic/bulk_views.py @@ -243,6 +243,7 @@ class BulkCreateView(GetReturnURLMixin, BaseMultiObjectView): # Validate each new object independently. if model_form.is_valid(): + model_form.instance._changelog_message = model_form.cleaned_data.get('changelog_message', '') obj = model_form.save() new_objects.append(obj) else: diff --git a/netbox/templates/generic/bulk_add.html b/netbox/templates/generic/bulk_add.html index b9c3999a1..99b60b3a1 100644 --- a/netbox/templates/generic/bulk_add.html +++ b/netbox/templates/generic/bulk_add.html @@ -21,31 +21,14 @@ {% endblock %} {% block pre_form_fields %} -
-
-

{% trans "Pattern" %}

-
- {% render_field form.pattern %} +
+
+

{% trans "Pattern" %}

+ {% render_field form.pattern %} +
{% endblock pre_form_fields %} {% block form %} - {% if model_form.fieldsets %} - {% for fieldset in model_form.fieldsets %} - {% render_fieldset model_form fieldset %} - {% endfor %} - {% else %} -
- {% render_form model_form %} -
- {% endif %} - - {% if model_form.custom_fields %} -
-
-

{% trans "Custom Fields" %}

-
- {% render_custom_fields model_form %} -
- {% endif %} + {% include 'htmx/form.html' with form=model_form %} {% endblock form %} diff --git a/netbox/templates/htmx/bulk_add_form.html b/netbox/templates/htmx/bulk_add_form.html index 7ea742b30..3e0a19899 100644 --- a/netbox/templates/htmx/bulk_add_form.html +++ b/netbox/templates/htmx/bulk_add_form.html @@ -1,22 +1 @@ -{% load helpers %} -{% load form_helpers %} -{% load i18n %} - -{% if model_form.fieldsets %} - {% for fieldset in model_form.fieldsets %} - {% render_fieldset model_form fieldset %} - {% endfor %} -{% else %} -
- {% render_form model_form %} -
-{% endif %} - -{% if model_form.custom_fields %} -
-
-

{% trans "Custom Fields" %}

-
- {% render_custom_fields model_form %} -
-{% endif %} +{% include 'htmx/form.html' with form=model_form %} From bcc410d99f82f278e71bdac9a37421f14219f229 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 6 Apr 2026 15:35:18 -0400 Subject: [PATCH 063/104] Closes #20924: Ready UI components for use by plugins (#21827) * Misc cleanup * Include permissions in TemplatedAttr context * Introduce CircuitTerminationPanel to replace generic panel * Replace all instantiations of Panel with TemplatePanel * Misc cleanup for layouts * Enable specifying column grid width * Panel.render() should pass the request to render_to_string() * CopyContent does not need to override render() * Avoid setting mutable panel actions * Catch exceptions raised when rendering embedded plugin content * Handle panel title when object is not available * Introduce should_render() method on Panel class * Misc cleanup * Pass the value returned by get_context() to should_render() * Yet more cleanup * Fix typos * Clean up object attrs * Replace candidate template panels with ObjectAttributesPanel subclasses * Add tests for object attrs * Remove beta warning * PluginContentPanel should not call should_render() * Clean up AddObject * speed.html should reference value for port_speed * Address PR feedback --- docs/plugins/development/ui-components.md | 97 +++++++--- netbox/circuits/ui/panels.py | 30 ++- netbox/circuits/views.py | 6 +- netbox/core/views.py | 6 + netbox/dcim/ui/panels.py | 78 ++++---- netbox/dcim/views.py | 19 +- netbox/extras/ui/panels.py | 9 +- netbox/ipam/ui/attrs.py | 21 +- netbox/ipam/ui/panels.py | 6 +- netbox/ipam/views.py | 15 ++ netbox/netbox/tests/test_ui.py | 183 +++++++++++++++++- netbox/netbox/ui/actions.py | 28 ++- netbox/netbox/ui/attrs.py | 105 +++++----- netbox/netbox/ui/layout.py | 33 +++- netbox/netbox/ui/panels.py | 100 ++++++---- .../circuit_termination/attrs/connection.html | 48 +++++ .../circuit_termination/attrs/speed.html | 8 + .../circuits/panels/circuit_termination.html | 16 -- .../dcim/panels/installed_device.html | 21 -- .../dcim/panels/installed_module.html | 33 ---- netbox/templates/generic/object.html | 8 +- netbox/templates/ui/attrs/numeric.html | 2 +- netbox/templates/ui/exception.html | 12 ++ netbox/templates/ui/panels/_base.html | 22 ++- .../vpn/panels/ipsecprofile_ike_policy.html | 34 ---- .../vpn/panels/ipsecprofile_ipsec_policy.html | 30 --- netbox/utilities/templatetags/plugins.py | 8 +- netbox/vpn/ui/panels.py | 17 ++ netbox/vpn/views.py | 5 +- netbox/wireless/ui/panels.py | 6 +- 30 files changed, 630 insertions(+), 376 deletions(-) create mode 100644 netbox/templates/circuits/circuit_termination/attrs/connection.html create mode 100644 netbox/templates/circuits/circuit_termination/attrs/speed.html delete mode 100644 netbox/templates/circuits/panels/circuit_termination.html delete mode 100644 netbox/templates/dcim/panels/installed_device.html delete mode 100644 netbox/templates/dcim/panels/installed_module.html create mode 100644 netbox/templates/ui/exception.html delete mode 100644 netbox/templates/vpn/panels/ipsecprofile_ike_policy.html delete mode 100644 netbox/templates/vpn/panels/ipsecprofile_ipsec_policy.html diff --git a/docs/plugins/development/ui-components.md b/docs/plugins/development/ui-components.md index a8fe2eff0..45766b201 100644 --- a/docs/plugins/development/ui-components.md +++ b/docs/plugins/development/ui-components.md @@ -1,12 +1,9 @@ # UI Components -!!! note "New in NetBox v4.5" - All UI components described here were introduced in NetBox v4.5. Be sure to set the minimum NetBox version to 4.5.0 for your plugin before incorporating any of these resources. +!!! note "New in NetBox v4.6" + All UI components described here were introduced in NetBox v4.6. Be sure to set the minimum NetBox version to 4.6.0 for your plugin before incorporating any of these resources. -!!! danger "Beta Feature" - UI components are considered a beta feature, and are still under active development. Please be aware that the API for resources on this page is subject to change in future releases. - -To simply the process of designing your plugin's user interface, and to encourage a consistent look and feel throughout the entire application, NetBox provides a set of components that enable programmatic UI design. These make it possible to declare complex page layouts with little or no custom HTML. +To simplify the process of designing your plugin's user interface, and to encourage a consistent look and feel throughout the entire application, NetBox provides a set of components that enable programmatic UI design. These make it possible to declare complex page layouts with little or no custom HTML. ## Page Layout @@ -75,9 +72,12 @@ class RecentChangesPanel(Panel): **super().get_context(context), 'changes': get_changes()[:10], } + + def should_render(self, context): + return len(context['changes']) > 0 ``` -NetBox also includes a set of panels suite for specific uses, such as display object details or embedding a table of related objects. These are listed below. +NetBox also includes a set of panels suited for specific uses, such as displaying object details or embedding a table of related objects. These are listed below. ::: netbox.ui.panels.Panel @@ -85,26 +85,6 @@ NetBox also includes a set of panels suite for specific uses, such as display ob ::: netbox.ui.panels.ObjectAttributesPanel -#### Object Attributes - -The following classes are available to represent object attributes within an ObjectAttributesPanel. Additionally, plugins can subclass `netbox.ui.attrs.ObjectAttribute` to create custom classes. - -| Class | Description | -|--------------------------------------|--------------------------------------------------| -| `netbox.ui.attrs.AddressAttr` | A physical or mailing address. | -| `netbox.ui.attrs.BooleanAttr` | A boolean value | -| `netbox.ui.attrs.ColorAttr` | A color expressed in RGB | -| `netbox.ui.attrs.ChoiceAttr` | A selection from a set of choices | -| `netbox.ui.attrs.GPSCoordinatesAttr` | GPS coordinates (latitude and longitude) | -| `netbox.ui.attrs.ImageAttr` | An attached image (displays the image) | -| `netbox.ui.attrs.NestedObjectAttr` | A related nested object | -| `netbox.ui.attrs.NumericAttr` | An integer or float value | -| `netbox.ui.attrs.RelatedObjectAttr` | A related object | -| `netbox.ui.attrs.TemplatedAttr` | Renders an attribute using a custom template | -| `netbox.ui.attrs.TextAttr` | A string (text) value | -| `netbox.ui.attrs.TimezoneAttr` | A timezone with annotated offset | -| `netbox.ui.attrs.UtilizationAttr` | A numeric value expressed as a utilization graph | - ::: netbox.ui.panels.OrganizationalObjectPanel ::: netbox.ui.panels.NestedGroupObjectPanel @@ -119,9 +99,13 @@ The following classes are available to represent object attributes within an Obj ::: netbox.ui.panels.TemplatePanel +::: netbox.ui.panels.TextCodePanel + +::: netbox.ui.panels.ContextTablePanel + ::: netbox.ui.panels.PluginContentPanel -## Panel Actions +### Panel Actions Each panel may have actions associated with it. These render as links or buttons within the panel header, opposite the panel's title. For example, a common use case is to include an "Add" action on a panel which displays a list of objects. Below is an example of this. @@ -146,3 +130,60 @@ panels.ObjectsTablePanel( ::: netbox.ui.actions.AddObject ::: netbox.ui.actions.CopyContent + +## Object Attributes + +The following classes are available to represent object attributes within an ObjectAttributesPanel. Additionally, plugins can subclass `netbox.ui.attrs.ObjectAttribute` to create custom classes. + +| Class | Description | +|------------------------------------------|--------------------------------------------------| +| `netbox.ui.attrs.AddressAttr` | A physical or mailing address. | +| `netbox.ui.attrs.BooleanAttr` | A boolean value | +| `netbox.ui.attrs.ChoiceAttr` | A selection from a set of choices | +| `netbox.ui.attrs.ColorAttr` | A color expressed in RGB | +| `netbox.ui.attrs.DateTimeAttr` | A date or datetime value | +| `netbox.ui.attrs.GenericForeignKeyAttr` | A related object via a generic foreign key | +| `netbox.ui.attrs.GPSCoordinatesAttr` | GPS coordinates (latitude and longitude) | +| `netbox.ui.attrs.ImageAttr` | An attached image (displays the image) | +| `netbox.ui.attrs.NestedObjectAttr` | A related nested object (includes ancestors) | +| `netbox.ui.attrs.NumericAttr` | An integer or float value | +| `netbox.ui.attrs.RelatedObjectAttr` | A related object | +| `netbox.ui.attrs.RelatedObjectListAttr` | A list of related objects | +| `netbox.ui.attrs.TemplatedAttr` | Renders an attribute using a custom template | +| `netbox.ui.attrs.TextAttr` | A string (text) value | +| `netbox.ui.attrs.TimezoneAttr` | A timezone with annotated offset | +| `netbox.ui.attrs.UtilizationAttr` | A numeric value expressed as a utilization graph | + +::: netbox.ui.attrs.ObjectAttribute + +::: netbox.ui.attrs.AddressAttr + +::: netbox.ui.attrs.BooleanAttr + +::: netbox.ui.attrs.ChoiceAttr + +::: netbox.ui.attrs.ColorAttr + +::: netbox.ui.attrs.DateTimeAttr + +::: netbox.ui.attrs.GenericForeignKeyAttr + +::: netbox.ui.attrs.GPSCoordinatesAttr + +::: netbox.ui.attrs.ImageAttr + +::: netbox.ui.attrs.NestedObjectAttr + +::: netbox.ui.attrs.NumericAttr + +::: netbox.ui.attrs.RelatedObjectAttr + +::: netbox.ui.attrs.RelatedObjectListAttr + +::: netbox.ui.attrs.TemplatedAttr + +::: netbox.ui.attrs.TextAttr + +::: netbox.ui.attrs.TimezoneAttr + +::: netbox.ui.attrs.UtilizationAttr diff --git a/netbox/circuits/ui/panels.py b/netbox/circuits/ui/panels.py index e8d6cf9bb..7f86db88f 100644 --- a/netbox/circuits/ui/panels.py +++ b/netbox/circuits/ui/panels.py @@ -13,13 +13,9 @@ class CircuitCircuitTerminationPanel(panels.ObjectPanel): template_name = 'circuits/panels/circuit_circuit_termination.html' title = _('Termination') - def __init__(self, accessor=None, side=None, **kwargs): - super().__init__(**kwargs) - - if accessor is not None: - self.accessor = accessor - if side is not None: - self.side = side + def __init__(self, side, accessor=None, **kwargs): + super().__init__(accessor=accessor, **kwargs) + self.side = side def get_context(self, context): return { @@ -58,6 +54,26 @@ class CircuitGroupAssignmentsPanel(panels.ObjectsTablePanel): ) +class CircuitTerminationPanel(panels.ObjectAttributesPanel): + title = _('Circuit Termination') + circuit = attrs.RelatedObjectAttr('circuit', linkify=True) + provider = attrs.RelatedObjectAttr('circuit.provider', linkify=True) + termination = attrs.GenericForeignKeyAttr('termination', linkify=True, label=_('Termination point')) + connection = attrs.TemplatedAttr( + 'pk', + template_name='circuits/circuit_termination/attrs/connection.html', + label=_('Connection'), + ) + speed = attrs.TemplatedAttr( + 'port_speed', + template_name='circuits/circuit_termination/attrs/speed.html', + label=_('Speed'), + ) + xconnect_id = attrs.TextAttr('xconnect_id', label=_('Cross-Connect'), style='font-monospace') + pp_info = attrs.TextAttr('pp_info', label=_('Patch Panel/Port')) + description = attrs.TextAttr('description') + + class CircuitGroupPanel(panels.OrganizationalObjectPanel): tenant = attrs.RelatedObjectAttr('tenant', linkify=True, grouped_by='group') diff --git a/netbox/circuits/views.py b/netbox/circuits/views.py index d6dad2e46..85912e00b 100644 --- a/netbox/circuits/views.py +++ b/netbox/circuits/views.py @@ -8,7 +8,6 @@ from netbox.ui import actions, layout from netbox.ui.panels import ( CommentsPanel, ObjectsTablePanel, - Panel, RelatedObjectsPanel, ) from netbox.views import generic @@ -512,10 +511,7 @@ class CircuitTerminationView(generic.ObjectView): queryset = CircuitTermination.objects.all() layout = layout.SimpleLayout( left_panels=[ - Panel( - template_name='circuits/panels/circuit_termination.html', - title=_('Circuit Termination'), - ) + panels.CircuitTerminationPanel(), ], right_panels=[ CustomFieldsPanel(), diff --git a/netbox/core/views.py b/netbox/core/views.py index 328679fa9..006fdc03c 100644 --- a/netbox/core/views.py +++ b/netbox/core/views.py @@ -193,8 +193,14 @@ class DataFileView(generic.ObjectView): layout.Column( panels.DataFilePanel(), panels.DataFileContentPanel(), + PluginContentPanel('left_page'), ), ), + layout.Row( + layout.Column( + PluginContentPanel('full_width_page'), + ) + ), ) diff --git a/netbox/dcim/ui/panels.py b/netbox/dcim/ui/panels.py index 0434d37ff..217a6b68f 100644 --- a/netbox/dcim/ui/panels.py +++ b/netbox/dcim/ui/panels.py @@ -1,5 +1,4 @@ from django.contrib.contenttypes.models import ContentType -from django.template.loader import render_to_string from django.utils.translation import gettext_lazy as _ from netbox.ui import actions, attrs, panels @@ -75,7 +74,7 @@ class RackReservationPanel(panels.ObjectAttributesPanel): unit_count = attrs.TextAttr('unit_count', label=_("Total U's")) status = attrs.ChoiceAttr('status') tenant = attrs.RelatedObjectAttr('tenant', linkify=True, grouped_by='group') - user = attrs.RelatedObjectAttr('user') + user = attrs.RelatedObjectAttr('user', linkify=True) description = attrs.TextAttr('description') @@ -220,8 +219,8 @@ class PowerPortPanel(panels.ObjectAttributesPanel): label = attrs.TextAttr('label') type = attrs.ChoiceAttr('type') description = attrs.TextAttr('description') - maximum_draw = attrs.TextAttr('maximum_draw') - allocated_draw = attrs.TextAttr('allocated_draw') + maximum_draw = attrs.TextAttr('maximum_draw', format_string='{}W') + allocated_draw = attrs.TextAttr('allocated_draw', format_string='{}W') class PowerOutletPanel(panels.ObjectAttributesPanel): @@ -244,7 +243,7 @@ class FrontPortPanel(panels.ObjectAttributesPanel): label = attrs.TextAttr('label') type = attrs.ChoiceAttr('type') color = attrs.ColorAttr('color') - positions = attrs.TextAttr('positions') + positions = attrs.NumericAttr('positions') description = attrs.TextAttr('description') @@ -255,7 +254,7 @@ class RearPortPanel(panels.ObjectAttributesPanel): label = attrs.TextAttr('label') type = attrs.ChoiceAttr('type') color = attrs.ColorAttr('color') - positions = attrs.TextAttr('positions') + positions = attrs.NumericAttr('positions') description = attrs.TextAttr('description') @@ -268,6 +267,15 @@ class ModuleBayPanel(panels.ObjectAttributesPanel): description = attrs.TextAttr('description') +class InstalledModulePanel(panels.ObjectAttributesPanel): + title = _('Installed Module') + module = attrs.RelatedObjectAttr('installed_module', linkify=True) + manufacturer = attrs.RelatedObjectAttr('installed_module.module_type.manufacturer', linkify=True) + module_type = attrs.RelatedObjectAttr('installed_module.module_type', linkify=True) + serial = attrs.TextAttr('installed_module.serial', label=_('Serial number'), style='font-monospace') + asset_tag = attrs.TextAttr('installed_module.asset_tag', style='font-monospace') + + class DeviceBayPanel(panels.ObjectAttributesPanel): device = attrs.RelatedObjectAttr('device', linkify=True) name = attrs.TextAttr('name') @@ -275,6 +283,12 @@ class DeviceBayPanel(panels.ObjectAttributesPanel): description = attrs.TextAttr('description') +class InstalledDevicePanel(panels.ObjectAttributesPanel): + title = _('Installed Device') + device = attrs.RelatedObjectAttr('installed_device', linkify=True) + device_type = attrs.RelatedObjectAttr('installed_device.device_type') + + class InventoryItemPanel(panels.ObjectAttributesPanel): device = attrs.RelatedObjectAttr('device', linkify=True) parent = attrs.RelatedObjectAttr('parent', linkify=True, label=_('Parent item')) @@ -393,10 +407,6 @@ class ConnectionPanel(panels.ObjectPanel): 'show_endpoints': self.show_endpoints, } - def render(self, context): - ctx = self.get_context(context) - return render_to_string(self.template_name, ctx, request=ctx.get('request')) - class InventoryItemsPanel(panels.ObjectPanel): """ @@ -414,10 +424,6 @@ class InventoryItemsPanel(panels.ObjectPanel): ), ] - def render(self, context): - ctx = self.get_context(context) - return render_to_string(self.template_name, ctx, request=ctx.get('request')) - class VirtualChassisMembersPanel(panels.ObjectPanel): """ @@ -451,10 +457,8 @@ class VirtualChassisMembersPanel(panels.ObjectPanel): 'vc_members': context.get('vc_members'), } - def render(self, context): - if not context.get('vc_members'): - return '' - return super().render(context) + def should_render(self, context): + return bool(context.get('vc_members')) class PowerUtilizationPanel(panels.ObjectPanel): @@ -470,11 +474,9 @@ class PowerUtilizationPanel(panels.ObjectPanel): 'vc_members': context.get('vc_members'), } - def render(self, context): + def should_render(self, context): obj = context['object'] - if not obj.powerports.exists() or not obj.poweroutlets.exists(): - return '' - return super().render(context) + return obj.powerports.exists() and obj.poweroutlets.exists() class InterfacePanel(panels.ObjectAttributesPanel): @@ -485,7 +487,7 @@ class InterfacePanel(panels.ObjectAttributesPanel): type = attrs.ChoiceAttr('type') speed = attrs.TemplatedAttr('speed', template_name='dcim/interface/attrs/speed.html', label=_('Speed')) duplex = attrs.ChoiceAttr('duplex') - mtu = attrs.TextAttr('mtu', label=_('MTU')) + mtu = attrs.NumericAttr('mtu', label=_('MTU')) enabled = attrs.BooleanAttr('enabled') mgmt_only = attrs.BooleanAttr('mgmt_only', label=_('Management only')) description = attrs.TextAttr('description') @@ -494,7 +496,7 @@ class InterfacePanel(panels.ObjectAttributesPanel): mode = attrs.ChoiceAttr('mode', label=_('802.1Q mode')) qinq_svlan = attrs.RelatedObjectAttr('qinq_svlan', linkify=True, label=_('Q-in-Q SVLAN')) untagged_vlan = attrs.RelatedObjectAttr('untagged_vlan', linkify=True, label=_('Untagged VLAN')) - tx_power = attrs.TextAttr('tx_power', label=_('Transmit power (dBm)')) + tx_power = attrs.TextAttr('tx_power', label=_('Transmit power'), format_string='{} dBm') tunnel = attrs.RelatedObjectAttr('tunnel_termination.tunnel', linkify=True, label=_('Tunnel')) l2vpn = attrs.RelatedObjectAttr('l2vpn_termination.l2vpn', linkify=True, label=_('L2VPN')) @@ -527,12 +529,9 @@ class InterfaceConnectionPanel(panels.ObjectPanel): template_name = 'dcim/panels/interface_connection.html' title = _('Connection') - def render(self, context): + def should_render(self, context): obj = context.get('object') - if obj and obj.is_virtual: - return '' - ctx = self.get_context(context) - return render_to_string(self.template_name, ctx, request=ctx.get('request')) + return False if (obj is None or obj.is_virtual) else True class VirtualCircuitPanel(panels.ObjectPanel): @@ -542,12 +541,11 @@ class VirtualCircuitPanel(panels.ObjectPanel): template_name = 'dcim/panels/interface_virtual_circuit.html' title = _('Virtual Circuit') - def render(self, context): + def should_render(self, context): obj = context.get('object') if not obj or not obj.is_virtual or not hasattr(obj, 'virtual_circuit_termination'): - return '' - ctx = self.get_context(context) - return render_to_string(self.template_name, ctx, request=ctx.get('request')) + return False + return True class InterfaceWirelessPanel(panels.ObjectPanel): @@ -557,12 +555,9 @@ class InterfaceWirelessPanel(panels.ObjectPanel): template_name = 'dcim/panels/interface_wireless.html' title = _('Wireless') - def render(self, context): + def should_render(self, context): obj = context.get('object') - if not obj or not obj.is_wireless: - return '' - ctx = self.get_context(context) - return render_to_string(self.template_name, ctx, request=ctx.get('request')) + return False if (obj is None or not obj.is_wireless) else True class WirelessLANsPanel(panels.ObjectPanel): @@ -572,9 +567,6 @@ class WirelessLANsPanel(panels.ObjectPanel): template_name = 'dcim/panels/interface_wireless_lans.html' title = _('Wireless LANs') - def render(self, context): + def should_render(self, context): obj = context.get('object') - if not obj or not obj.is_wireless: - return '' - ctx = self.get_context(context) - return render_to_string(self.template_name, ctx, request=ctx.get('request')) + return False if (obj is None or not obj.is_wireless) else True diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 5ebb22c6b..847210267 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -27,7 +27,6 @@ from netbox.ui.panels import ( NestedGroupObjectPanel, ObjectsTablePanel, OrganizationalObjectPanel, - Panel, RelatedObjectsPanel, TemplatePanel, ) @@ -1771,7 +1770,7 @@ class ModuleTypeView(GetRelatedModelsMixin, generic.ObjectView): CommentsPanel(), ], right_panels=[ - Panel( + TemplatePanel( title=_('Attributes'), template_name='dcim/panels/module_type_attributes.html', ), @@ -2945,7 +2944,7 @@ class ModuleView(GetRelatedModelsMixin, generic.ObjectView): CommentsPanel(), ], right_panels=[ - Panel( + TemplatePanel( title=_('Module Type'), template_name='dcim/panels/module_type.html', ), @@ -3753,10 +3752,7 @@ class ModuleBayView(generic.ObjectView): ], right_panels=[ CustomFieldsPanel(), - Panel( - title=_('Installed Module'), - template_name='dcim/panels/installed_module.html', - ), + panels.InstalledModulePanel(), ], ) @@ -3828,10 +3824,7 @@ class DeviceBayView(generic.ObjectView): TagsPanel(), ], right_panels=[ - Panel( - title=_('Installed Device'), - template_name='dcim/panels/installed_device.html', - ), + panels.InstalledDevicePanel(), ], ) @@ -4323,11 +4316,11 @@ class CableView(generic.ObjectView): CommentsPanel(), ], right_panels=[ - Panel( + TemplatePanel( title=_('Termination A'), template_name='dcim/panels/cable_termination_a.html', ), - Panel( + TemplatePanel( title=_('Termination B'), template_name='dcim/panels/cable_termination_b.html', ), diff --git a/netbox/extras/ui/panels.py b/netbox/extras/ui/panels.py index 51b59c57b..23a3da37b 100644 --- a/netbox/extras/ui/panels.py +++ b/netbox/extras/ui/panels.py @@ -1,5 +1,4 @@ from django.contrib.contenttypes.models import ContentType -from django.template.loader import render_to_string from django.utils.translation import gettext_lazy as _ from netbox.ui import actions, attrs, panels @@ -65,12 +64,8 @@ class CustomFieldsPanel(panels.ObjectPanel): 'custom_fields': obj.get_custom_fields_by_group(), } - def render(self, context): - ctx = self.get_context(context) - # Hide the panel if no custom fields exist - if not ctx['custom_fields']: - return '' - return render_to_string(self.template_name, self.get_context(context)) + def should_render(self, context): + return bool(context['custom_fields']) class ImageAttachmentsPanel(panels.ObjectsTablePanel): diff --git a/netbox/ipam/ui/attrs.py b/netbox/ipam/ui/attrs.py index cd5cba0f2..aab23648b 100644 --- a/netbox/ipam/ui/attrs.py +++ b/netbox/ipam/ui/attrs.py @@ -7,6 +7,9 @@ class VRFDisplayAttr(attrs.ObjectAttribute): """ Renders a VRF reference, displaying 'Global' when no VRF is assigned. Optionally includes the route distinguisher (RD). + + Parameters: + show_rd (bool): If true, the VRF's RD will be included. (Default: False) """ template_name = 'ipam/attrs/vrf.html' @@ -14,11 +17,17 @@ class VRFDisplayAttr(attrs.ObjectAttribute): super().__init__(*args, **kwargs) self.show_rd = show_rd - def render(self, obj, context): - value = self.get_value(obj) - return render_to_string(self.template_name, { - **self.get_context(obj, context), - 'name': context['name'], - 'value': value, + def get_context(self, obj, attr, value, context): + return { 'show_rd': self.show_rd, + } + + def render(self, obj, context): + name = context['name'] + value = self.get_value(obj) + + return render_to_string(self.template_name, { + **self.get_context(obj, name, value, context), + 'name': name, + 'value': value, }) diff --git a/netbox/ipam/ui/panels.py b/netbox/ipam/ui/panels.py index 06e429967..c8984352a 100644 --- a/netbox/ipam/ui/panels.py +++ b/netbox/ipam/ui/panels.py @@ -229,11 +229,9 @@ class VLANCustomerVLANsPanel(panels.ObjectsTablePanel): ], ) - def render(self, context): + def should_render(self, context): obj = context.get('object') - if not obj or obj.qinq_role != 'svlan': - return '' - return super().render(context) + return False if (obj is None or obj.qinq_role != 'svlan') else True class ServiceTemplatePanel(panels.ObjectAttributesPanel): diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 4fc30342b..3b1ce9b10 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -16,6 +16,7 @@ from netbox.ui.panels import ( CommentsPanel, ContextTablePanel, ObjectsTablePanel, + PluginContentPanel, RelatedObjectsPanel, TemplatePanel, ) @@ -55,11 +56,13 @@ class VRFView(GetRelatedModelsMixin, generic.ObjectView): layout.Column( panels.VRFPanel(), TagsPanel(), + PluginContentPanel('left_page'), ), layout.Column( RelatedObjectsPanel(), CustomFieldsPanel(), CommentsPanel(), + PluginContentPanel('right_page'), ), ), layout.Row( @@ -70,6 +73,11 @@ class VRFView(GetRelatedModelsMixin, generic.ObjectView): ContextTablePanel('export_targets_table', title=_('Export route targets')), ), ), + layout.Row( + layout.Column( + PluginContentPanel('full_width_page'), + ), + ), ) def get_extra_context(self, request, instance): @@ -169,10 +177,12 @@ class RouteTargetView(generic.ObjectView): layout.Column( panels.RouteTargetPanel(), TagsPanel(), + PluginContentPanel('left_page'), ), layout.Column( CustomFieldsPanel(), CommentsPanel(), + PluginContentPanel('right_page'), ), ), layout.Row( @@ -207,6 +217,11 @@ class RouteTargetView(generic.ObjectView): ), ), ), + layout.Row( + layout.Column( + PluginContentPanel('full_width_page'), + ), + ), ) diff --git a/netbox/netbox/tests/test_ui.py b/netbox/netbox/tests/test_ui.py index cb76517c1..4d0a05415 100644 --- a/netbox/netbox/tests/test_ui.py +++ b/netbox/netbox/tests/test_ui.py @@ -1,3 +1,5 @@ +from types import SimpleNamespace + from django.test import TestCase from circuits.choices import CircuitStatusChoices, VirtualCircuitTerminationRoleChoices @@ -76,7 +78,7 @@ class ChoiceAttrTest(TestCase): self.termination.get_role_display(), ) self.assertEqual( - attr.get_context(self.termination, {}), + attr.get_context(self.termination, 'role', attr.get_value(self.termination), {}), {'bg_color': self.termination.get_role_color()}, ) @@ -88,7 +90,7 @@ class ChoiceAttrTest(TestCase): self.termination.interface.get_type_display(), ) self.assertEqual( - attr.get_context(self.termination, {}), + attr.get_context(self.termination, 'interface.type', attr.get_value(self.termination), {}), {'bg_color': None}, ) @@ -100,7 +102,9 @@ class ChoiceAttrTest(TestCase): self.termination.virtual_circuit.get_status_display(), ) self.assertEqual( - attr.get_context(self.termination, {}), + attr.get_context( + self.termination, 'virtual_circuit.status', attr.get_value(self.termination), {} + ), {'bg_color': self.termination.virtual_circuit.get_status_color()}, ) @@ -213,3 +217,176 @@ class RelatedObjectListAttrTest(TestCase): self.assertInHTML('
  • IKE Proposal 2
  • ', rendered) self.assertNotIn('IKE Proposal 3', rendered) self.assertIn('…', rendered) + + +class TextAttrTest(TestCase): + + def test_get_value_with_format_string(self): + attr = attrs.TextAttr('asn', format_string='AS{}') + obj = SimpleNamespace(asn=65000) + self.assertEqual(attr.get_value(obj), 'AS65000') + + def test_get_value_without_format_string(self): + attr = attrs.TextAttr('name') + obj = SimpleNamespace(name='foo') + self.assertEqual(attr.get_value(obj), 'foo') + + def test_get_value_none_skips_format_string(self): + attr = attrs.TextAttr('name', format_string='prefix-{}') + obj = SimpleNamespace(name=None) + self.assertIsNone(attr.get_value(obj)) + + def test_get_context(self): + attr = attrs.TextAttr('name', style='text-monospace', copy_button=True) + obj = SimpleNamespace(name='bar') + context = attr.get_context(obj, 'name', 'bar', {}) + self.assertEqual(context['style'], 'text-monospace') + self.assertTrue(context['copy_button']) + + +class NumericAttrTest(TestCase): + + def test_get_context_with_unit_accessor(self): + attr = attrs.NumericAttr('speed', unit_accessor='speed_unit') + obj = SimpleNamespace(speed=1000, speed_unit='Mbps') + context = attr.get_context(obj, 'speed', 1000, {}) + self.assertEqual(context['unit'], 'Mbps') + + def test_get_context_without_unit_accessor(self): + attr = attrs.NumericAttr('speed') + obj = SimpleNamespace(speed=1000) + context = attr.get_context(obj, 'speed', 1000, {}) + self.assertIsNone(context['unit']) + + def test_get_context_copy_button(self): + attr = attrs.NumericAttr('speed', copy_button=True) + obj = SimpleNamespace(speed=1000) + context = attr.get_context(obj, 'speed', 1000, {}) + self.assertTrue(context['copy_button']) + + +class BooleanAttrTest(TestCase): + + def test_false_value_shown_by_default(self): + attr = attrs.BooleanAttr('enabled') + obj = SimpleNamespace(enabled=False) + self.assertIs(attr.get_value(obj), False) + + def test_false_value_hidden_when_display_false_disabled(self): + attr = attrs.BooleanAttr('enabled', display_false=False) + obj = SimpleNamespace(enabled=False) + self.assertIsNone(attr.get_value(obj)) + + def test_true_value_always_shown(self): + attr = attrs.BooleanAttr('enabled', display_false=False) + obj = SimpleNamespace(enabled=True) + self.assertIs(attr.get_value(obj), True) + + +class ImageAttrTest(TestCase): + + def test_invalid_decoding_raises_value_error(self): + with self.assertRaises(ValueError): + attrs.ImageAttr('image', decoding='invalid') + + def test_default_decoding_for_lazy_image(self): + attr = attrs.ImageAttr('image') + self.assertTrue(attr.load_lazy) + self.assertEqual(attr.decoding, 'async') + + def test_default_decoding_for_non_lazy_image(self): + attr = attrs.ImageAttr('image', load_lazy=False) + self.assertFalse(attr.load_lazy) + self.assertIsNone(attr.decoding) + + def test_explicit_decoding_value(self): + attr = attrs.ImageAttr('image', load_lazy=False, decoding='sync') + self.assertEqual(attr.decoding, 'sync') + + def test_get_context(self): + attr = attrs.ImageAttr('image', load_lazy=False, decoding='async') + obj = SimpleNamespace(image='test.png') + context = attr.get_context(obj, 'image', 'test.png', {}) + self.assertEqual(context['decoding'], 'async') + self.assertFalse(context['load_lazy']) + + +class RelatedObjectAttrTest(TestCase): + + def test_get_context_with_grouped_by(self): + region = SimpleNamespace(name='Region 1') + site = SimpleNamespace(name='Site 1', region=region) + obj = SimpleNamespace(site=site) + attr = attrs.RelatedObjectAttr('site', grouped_by='region') + context = attr.get_context(obj, 'site', site, {}) + self.assertEqual(context['group'], region) + + def test_get_context_without_grouped_by(self): + site = SimpleNamespace(name='Site 1') + obj = SimpleNamespace(site=site) + attr = attrs.RelatedObjectAttr('site') + context = attr.get_context(obj, 'site', site, {}) + self.assertIsNone(context['group']) + + def test_get_context_linkify(self): + site = SimpleNamespace(name='Site 1') + obj = SimpleNamespace(site=site) + attr = attrs.RelatedObjectAttr('site', linkify=True) + context = attr.get_context(obj, 'site', site, {}) + self.assertTrue(context['linkify']) + + +class GenericForeignKeyAttrTest(TestCase): + + def test_get_context_content_type(self): + value = SimpleNamespace(_meta=SimpleNamespace(verbose_name='provider')) + obj = SimpleNamespace() + attr = attrs.GenericForeignKeyAttr('assigned_object') + context = attr.get_context(obj, 'assigned_object', value, {}) + self.assertEqual(context['content_type'], 'provider') + + def test_get_context_linkify(self): + value = SimpleNamespace(_meta=SimpleNamespace(verbose_name='provider')) + obj = SimpleNamespace() + attr = attrs.GenericForeignKeyAttr('assigned_object', linkify=True) + context = attr.get_context(obj, 'assigned_object', value, {}) + self.assertTrue(context['linkify']) + + +class GPSCoordinatesAttrTest(TestCase): + + def test_missing_latitude_returns_placeholder(self): + attr = attrs.GPSCoordinatesAttr() + obj = SimpleNamespace(latitude=None, longitude=-74.006) + self.assertEqual(attr.render(obj, {'name': 'coordinates'}), attr.placeholder) + + def test_missing_longitude_returns_placeholder(self): + attr = attrs.GPSCoordinatesAttr() + obj = SimpleNamespace(latitude=40.712, longitude=None) + self.assertEqual(attr.render(obj, {'name': 'coordinates'}), attr.placeholder) + + def test_both_missing_returns_placeholder(self): + attr = attrs.GPSCoordinatesAttr() + obj = SimpleNamespace(latitude=None, longitude=None) + self.assertEqual(attr.render(obj, {'name': 'coordinates'}), attr.placeholder) + + +class DateTimeAttrTest(TestCase): + + def test_default_spec(self): + attr = attrs.DateTimeAttr('created') + obj = SimpleNamespace(created='2024-01-01') + context = attr.get_context(obj, 'created', '2024-01-01', {}) + self.assertEqual(context['spec'], 'seconds') + + def test_date_spec(self): + attr = attrs.DateTimeAttr('created', spec='date') + obj = SimpleNamespace(created='2024-01-01') + context = attr.get_context(obj, 'created', '2024-01-01', {}) + self.assertEqual(context['spec'], 'date') + + def test_minutes_spec(self): + attr = attrs.DateTimeAttr('created', spec='minutes') + obj = SimpleNamespace(created='2024-01-01') + context = attr.get_context(obj, 'created', '2024-01-01', {}) + self.assertEqual(context['spec'], 'minutes') diff --git a/netbox/netbox/ui/actions.py b/netbox/netbox/ui/actions.py index 7579e7b93..4363c722d 100644 --- a/netbox/netbox/ui/actions.py +++ b/netbox/netbox/ui/actions.py @@ -59,7 +59,7 @@ class PanelAction: """ # Enforce permissions user = context['request'].user - if not user.has_perms(self.permissions): + if self.permissions and not user.has_perms(self.permissions): return '' return render_to_string(self.template_name, self.get_context(context)) @@ -118,19 +118,19 @@ class AddObject(LinkAction): url_params (dict): A dictionary of arbitrary URL parameters to append to the resolved URL """ def __init__(self, model, url_params=None, **kwargs): - # Resolve the model class from its app.name label - try: - app_label, model_name = model.split('.') - model = apps.get_model(app_label, model_name) - except (ValueError, LookupError): + # Resolve the model from its label + if '.' not in model: + raise ValueError(f"Invalid model label: {model}") + try: + self.model = apps.get_model(model) + except LookupError: raise ValueError(f"Invalid model label: {model}") - view_name = get_viewname(model, 'add') kwargs.setdefault('label', _('Add')) kwargs.setdefault('button_icon', 'plus-thick') - kwargs.setdefault('permissions', [get_permission_for_model(model, 'add')]) + kwargs.setdefault('permissions', [get_permission_for_model(self.model, 'add')]) - super().__init__(view_name=view_name, url_params=url_params, **kwargs) + super().__init__(view_name=get_viewname(self.model, 'add'), url_params=url_params, **kwargs) class CopyContent(PanelAction): @@ -148,10 +148,8 @@ class CopyContent(PanelAction): super().__init__(**kwargs) self.target_id = target_id - def render(self, context): - return render_to_string(self.template_name, { + def get_context(self, context): + return { + **super().get_context(context), 'target_id': self.target_id, - 'label': self.label, - 'button_class': self.button_class, - 'button_icon': self.button_icon, - }) + } diff --git a/netbox/netbox/ui/attrs.py b/netbox/netbox/ui/attrs.py index e4bd93c4e..83a7e912e 100644 --- a/netbox/netbox/ui/attrs.py +++ b/netbox/netbox/ui/attrs.py @@ -29,11 +29,27 @@ PLACEHOLDER_HTML = '' IMAGE_DECODING_CHOICES = ('auto', 'async', 'sync') + +# +# Mixins +# + +class MapURLMixin: + _map_url = None + + @property + def map_url(self): + if self._map_url is True: + return get_config().MAPS_URL + if self._map_url: + return self._map_url + return None + + # # Attributes # - class ObjectAttribute: """ Base class for representing an attribute of an object. @@ -64,17 +80,20 @@ class ObjectAttribute: """ return resolve_attr_path(obj, self.accessor) - def get_context(self, obj, context): + def get_context(self, obj, attr, value, context): """ Return any additional template context used to render the attribute value. Parameters: obj (object): The object for which the attribute is being rendered - context (dict): The root template context + attr (str): The name of the attribute being rendered + value: The value of the attribute on the object + context (dict): The panel template context """ return {} def render(self, obj, context): + name = context['name'] value = self.get_value(obj) # If the value is empty, render a placeholder @@ -82,8 +101,8 @@ class ObjectAttribute: return self.placeholder return render_to_string(self.template_name, { - **self.get_context(obj, context), - 'name': context['name'], + **self.get_context(obj, name, value, context), + 'name': name, 'value': value, }) @@ -112,7 +131,7 @@ class TextAttr(ObjectAttribute): return self.format_string.format(value) return value - def get_context(self, obj, context): + def get_context(self, obj, attr, value, context): return { 'style': self.style, 'copy_button': self.copy_button, @@ -134,7 +153,7 @@ class NumericAttr(ObjectAttribute): self.unit_accessor = unit_accessor self.copy_button = copy_button - def get_context(self, obj, context): + def get_context(self, obj, attr, value, context): unit = resolve_attr_path(obj, self.unit_accessor) if self.unit_accessor else None return { 'unit': unit, @@ -172,7 +191,7 @@ class ChoiceAttr(ObjectAttribute): return resolve_attr_path(target, field_name) - def get_context(self, obj, context): + def get_context(self, obj, attr, value, context): target, field_name = self._resolve_target(obj) if target is None: return {'bg_color': None} @@ -241,7 +260,7 @@ class ImageAttr(ObjectAttribute): decoding = 'async' self.decoding = decoding - def get_context(self, obj, context): + def get_context(self, obj, attr, value, context): return { 'decoding': self.decoding, 'load_lazy': self.load_lazy, @@ -264,8 +283,7 @@ class RelatedObjectAttr(ObjectAttribute): self.linkify = linkify self.grouped_by = grouped_by - def get_context(self, obj, context): - value = self.get_value(obj) + def get_context(self, obj, attr, value, context): group = getattr(value, self.grouped_by, None) if self.grouped_by else None return { 'linkify': self.linkify, @@ -300,14 +318,13 @@ class RelatedObjectListAttr(RelatedObjectAttr): self.max_items = max_items self.overflow_indicator = overflow_indicator - def _get_items(self, obj): + def _get_items(self, items): """ Retrieve items from the given object using the accessor path. Returns a tuple of (items, has_more) where items is a list of resolved objects and has_more indicates whether additional items exist beyond the max_items limit. """ - items = resolve_attr_path(obj, self.accessor) if items is None: return [], False @@ -322,8 +339,8 @@ class RelatedObjectListAttr(RelatedObjectAttr): return items[:self.max_items], has_more - def get_context(self, obj, context): - items, has_more = self._get_items(obj) + def get_context(self, obj, attr, value, context): + items, has_more = self._get_items(value) return { 'linkify': self.linkify, @@ -338,14 +355,15 @@ class RelatedObjectListAttr(RelatedObjectAttr): } def render(self, obj, context): - context = context or {} - context_data = self.get_context(obj, context) + name = context['name'] + value = self.get_value(obj) + context_data = self.get_context(obj, name, value, context) if not context_data['items']: return self.placeholder return render_to_string(self.template_name, { - 'name': context.get('name'), + 'name': name, **context_data, }) @@ -366,11 +384,12 @@ class NestedObjectAttr(ObjectAttribute): self.linkify = linkify self.max_depth = max_depth - def get_context(self, obj, context): - value = self.get_value(obj) - nodes = value.get_ancestors(include_self=True) - if self.max_depth: - nodes = list(nodes)[-self.max_depth:] + def get_context(self, obj, attr, value, context): + nodes = [] + if value is not None: + nodes = value.get_ancestors(include_self=True) + if self.max_depth: + nodes = list(nodes)[-self.max_depth:] return { 'nodes': nodes, 'linkify': self.linkify, @@ -394,40 +413,35 @@ class GenericForeignKeyAttr(ObjectAttribute): super().__init__(*args, **kwargs) self.linkify = linkify - def get_context(self, obj, context): - value = self.get_value(obj) - content_type = value._meta.verbose_name + def get_context(self, obj, attr, value, context): + content_type = value._meta.verbose_name if value is not None else None return { 'content_type': content_type, 'linkify': self.linkify, } -class AddressAttr(ObjectAttribute): +class AddressAttr(MapURLMixin, ObjectAttribute): """ A physical or mailing address. Parameters: - map_url (bool): If true, the address will render as a hyperlink using settings.MAPS_URL + map_url (bool/str): The URL to use when rendering the address. If True, the address will render as a + hyperlink using settings.MAPS_URL. """ template_name = 'ui/attrs/address.html' def __init__(self, *args, map_url=True, **kwargs): super().__init__(*args, **kwargs) - if map_url is True: - self.map_url = get_config().MAPS_URL - elif map_url: - self.map_url = map_url - else: - self.map_url = None + self._map_url = map_url - def get_context(self, obj, context): + def get_context(self, obj, attr, value, context): return { 'map_url': self.map_url, } -class GPSCoordinatesAttr(ObjectAttribute): +class GPSCoordinatesAttr(MapURLMixin, ObjectAttribute): """ A GPS coordinates pair comprising latitude and longitude values. @@ -440,24 +454,18 @@ class GPSCoordinatesAttr(ObjectAttribute): label = _('GPS coordinates') def __init__(self, latitude_attr='latitude', longitude_attr='longitude', map_url=True, **kwargs): - super().__init__(accessor=None, **kwargs) + super().__init__(accessor=latitude_attr, **kwargs) self.latitude_attr = latitude_attr self.longitude_attr = longitude_attr - if map_url is True: - self.map_url = get_config().MAPS_URL - elif map_url: - self.map_url = map_url - else: - self.map_url = None + self._map_url = map_url - def render(self, obj, context=None): - context = context or {} + def render(self, obj, context): latitude = resolve_attr_path(obj, self.latitude_attr) longitude = resolve_attr_path(obj, self.longitude_attr) if latitude is None or longitude is None: return self.placeholder return render_to_string(self.template_name, { - **context, + 'name': context['name'], 'latitude': latitude, 'longitude': longitude, 'map_url': self.map_url, @@ -478,7 +486,7 @@ class DateTimeAttr(ObjectAttribute): super().__init__(*args, **kwargs) self.spec = spec - def get_context(self, obj, context): + def get_context(self, obj, attr, value, context): return { 'spec': self.spec, } @@ -504,8 +512,9 @@ class TemplatedAttr(ObjectAttribute): self.template_name = template_name self.context = context or {} - def get_context(self, obj, context): + def get_context(self, obj, attr, value, context): return { + **context, **self.context, 'object': obj, } diff --git a/netbox/netbox/ui/layout.py b/netbox/netbox/ui/layout.py index b59fd7b34..375417288 100644 --- a/netbox/netbox/ui/layout.py +++ b/netbox/netbox/ui/layout.py @@ -21,10 +21,16 @@ class Layout: """ def __init__(self, *rows): for i, row in enumerate(rows): - if type(row) is not Row: + if not isinstance(row, Row): raise TypeError(f"Row {i} must be a Row instance, not {type(row)}.") self.rows = rows + def __iter__(self): + return iter(self.rows) + + def __repr__(self): + return f"Layout({len(self.rows)} rows)" + class Row: """ @@ -35,10 +41,16 @@ class Row: """ def __init__(self, *columns): for i, column in enumerate(columns): - if type(column) is not Column: + if not isinstance(column, Column): raise TypeError(f"Column {i} must be a Column instance, not {type(column)}.") self.columns = columns + def __iter__(self): + return iter(self.columns) + + def __repr__(self): + return f"Row({len(self.columns)} columns)" + class Column: """ @@ -46,12 +58,25 @@ class Column: Parameters: *panels: One or more Panel instances + width: Bootstrap grid column width (1-12). If unset, the column will expand to fill available space. """ - def __init__(self, *panels): + def __init__(self, *panels, width=None): for i, panel in enumerate(panels): if not isinstance(panel, Panel): raise TypeError(f"Panel {i} must be an instance of a Panel, not {type(panel)}.") + if width is not None: + if type(width) is not int: + raise ValueError(f"Column width must be an integer, not {type(width)}") + if width not in range(1, 13): + raise ValueError(f"Column width must be an integer between 1 and 12 (got {width}).") self.panels = panels + self.width = width + + def __iter__(self): + return iter(self.panels) + + def __repr__(self): + return f"Column({len(self.panels)} panels)" # @@ -62,7 +87,7 @@ class SimpleLayout(Layout): """ A layout with one row of two columns and a second row with one column. - Plugin content registered for `left_page`, `right_page`, or `full_width_path` is included automatically. Most object + Plugin content registered for `left_page`, `right_page`, or `full_width_page` is included automatically. Most object views in NetBox utilize this layout. ``` diff --git a/netbox/netbox/ui/panels.py b/netbox/netbox/ui/panels.py index fa26cf754..87bf30d6a 100644 --- a/netbox/netbox/ui/panels.py +++ b/netbox/netbox/ui/panels.py @@ -45,18 +45,17 @@ class Panel: Parameters: title (str): The human-friendly title of the panel actions (list): An iterable of PanelActions to include in the panel header - template_name (str): Overrides the default template name, if defined """ template_name = None title = None actions = None - def __init__(self, title=None, actions=None, template_name=None): + def __init__(self, title=None, actions=None): if title is not None: self.title = title - self.actions = actions or self.actions or [] - if template_name is not None: - self.template_name = template_name + if actions is not None: + self.actions = actions + self.actions = list(self.actions) if self.actions else [] def get_context(self, context): """ @@ -74,6 +73,15 @@ class Panel: 'panel_class': self.__class__.__name__, } + def should_render(self, context): + """ + Determines whether the panel should render on the page. (Default: True) + + Parameters: + context (dict): The panel's prepared context (the return value of get_context()) + """ + return True + def render(self, context): """ Render the panel as HTML. @@ -81,7 +89,10 @@ class Panel: Parameters: context (dict): The template context """ - return render_to_string(self.template_name, self.get_context(context)) + ctx = self.get_context(context) + if not self.should_render(ctx): + return '' + return render_to_string(self.template_name, ctx, request=ctx.get('request')) # @@ -105,9 +116,15 @@ class ObjectPanel(Panel): def get_context(self, context): obj = resolve_attr_path(context, self.accessor) + if self.title is not None: + title_ = self.title + elif obj is not None: + title_ = title(obj._meta.verbose_name) + else: + title_ = None return { **super().get_context(context), - 'title': self.title or title(obj._meta.verbose_name), + 'title': title_, 'object': obj, } @@ -187,7 +204,7 @@ class ObjectAttributesPanel(ObjectPanel, metaclass=ObjectAttributesPanelMeta): 'attrs': [ { 'label': attr.label or self._name_to_label(name), - 'value': attr.render(ctx['object'], {'name': name}), + 'value': attr.render(ctx['object'], {'name': name, 'perms': ctx['perms']}), } for name, attr in self._attrs.items() if name in attr_names ], } @@ -225,9 +242,10 @@ class CommentsPanel(ObjectPanel): self.field_name = field_name def get_context(self, context): + ctx = super().get_context(context) return { - **super().get_context(context), - 'comments': getattr(context['object'], self.field_name), + **ctx, + 'comments': getattr(ctx['object'], self.field_name, None), } @@ -249,9 +267,10 @@ class JSONPanel(ObjectPanel): self.actions.append(CopyContent(f'panel_{field_name}')) def get_context(self, context): + ctx = super().get_context(context) return { - **super().get_context(context), - 'data': getattr(context['object'], self.field_name), + **ctx, + 'data': getattr(ctx['object'], self.field_name, None), 'field_name': self.field_name, } @@ -291,22 +310,27 @@ class ObjectsTablePanel(Panel): def __init__(self, model, filters=None, include_columns=None, exclude_columns=None, **kwargs): super().__init__(**kwargs) - # Resolve the model class from its app.name label - try: - app_label, model_name = model.split('.') - self.model = apps.get_model(app_label, model_name) - except (ValueError, LookupError): + # Validate the model label format + if '.' not in model: raise ValueError(f"Invalid model label: {model}") - + self.model_label = model self.filters = filters or {} self.include_columns = include_columns or [] self.exclude_columns = exclude_columns or [] - # If no title is specified, derive one from the model name - if self.title is None: - self.title = title(self.model._meta.verbose_name_plural) + @property + def model(self): + try: + return apps.get_model(self.model_label) + except LookupError: + raise ValueError(f"Invalid model label: {self.model_label}") def get_context(self, context): + model = self.model + + # If no title is specified, derive one from the model name + panel_title = self.title or title(model._meta.verbose_name_plural) + url_params = { k: v(context) if callable(v) else v for k, v in self.filters.items() } @@ -318,7 +342,8 @@ class ObjectsTablePanel(Panel): url_params['exclude_columns'] = ','.join(self.exclude_columns) return { **super().get_context(context), - 'viewname': get_viewname(self.model, 'list'), + 'title': panel_title, + 'viewname': get_viewname(model, 'list'), 'url_params': dict_to_querydict(url_params), } @@ -330,12 +355,17 @@ class TemplatePanel(Panel): Parameters: template_name (str): The name of the template to render """ - def __init__(self, template_name): - super().__init__(template_name=template_name) + def __init__(self, template_name, **kwargs): + self.template_name = template_name + super().__init__(**kwargs) - def render(self, context): - # Pass the entire context to the template - return render_to_string(self.template_name, context.flatten()) + def get_context(self, context): + # Pass the entire context to the template, but let the panel's own context take precedence + # for panel-specific variables (title, actions, panel_class) + return { + **context.flatten(), + **super().get_context(context) + } class TextCodePanel(ObjectPanel): @@ -350,10 +380,11 @@ class TextCodePanel(ObjectPanel): self.show_sync_warning = show_sync_warning def get_context(self, context): + ctx = super().get_context(context) return { - **super().get_context(context), + **ctx, 'show_sync_warning': self.show_sync_warning, - 'value': getattr(context.get('object'), self.field_name, None), + 'value': getattr(ctx['object'], self.field_name, None), } @@ -369,6 +400,7 @@ class PluginContentPanel(Panel): self.method = method def render(self, context): + # Override the default render() method to simply embed rendered plugin content obj = context.get('object') return _get_registered_content(obj, self.method, context) @@ -399,14 +431,10 @@ class ContextTablePanel(ObjectPanel): return context.get(self.table) def get_context(self, context): - table = self._resolve_table(context) return { **super().get_context(context), - 'table': table, + 'table': self._resolve_table(context), } - def render(self, context): - table = self._resolve_table(context) - if table is None: - return '' - return super().render(context) + def should_render(self, context): + return context.get('table') is not None diff --git a/netbox/templates/circuits/circuit_termination/attrs/connection.html b/netbox/templates/circuits/circuit_termination/attrs/connection.html new file mode 100644 index 000000000..0a60f9a41 --- /dev/null +++ b/netbox/templates/circuits/circuit_termination/attrs/connection.html @@ -0,0 +1,48 @@ +{% load helpers i18n %} +{% if object.mark_connected %} +
    + + {% trans "Marked as connected" %} +
    +{% elif object.cable %} +
    + {{ object.cable }} {% trans "to" %} + {% for peer in object.link_peers %} + {% if peer.device %} + {{ peer.device|linkify }}
    + {% elif peer.circuit %} + {{ peer.circuit|linkify }}
    + {% endif %} + {{ peer|linkify }}{% if not forloop.last %},{% endif %} + {% endfor %} +
    +
    + + {% trans "Trace" %} + + {% if perms.dcim.change_cable %} + + {% trans "Edit" %} + + {% endif %} + {% if perms.dcim.delete_cable %} + + {% trans "Disconnect" %} + + {% endif %} +
    +{% elif perms.dcim.add_cable %} + +{% else %} + {{ ''|placeholder }} +{% endif %} diff --git a/netbox/templates/circuits/circuit_termination/attrs/speed.html b/netbox/templates/circuits/circuit_termination/attrs/speed.html new file mode 100644 index 000000000..a590ad27a --- /dev/null +++ b/netbox/templates/circuits/circuit_termination/attrs/speed.html @@ -0,0 +1,8 @@ +{% load helpers i18n %} +{% if object.upstream_speed %} + {{ value|humanize_speed }} + + {{ object.upstream_speed|humanize_speed }} +{% else %} + {{ value|humanize_speed }} +{% endif %} diff --git a/netbox/templates/circuits/panels/circuit_termination.html b/netbox/templates/circuits/panels/circuit_termination.html deleted file mode 100644 index 5583d1536..000000000 --- a/netbox/templates/circuits/panels/circuit_termination.html +++ /dev/null @@ -1,16 +0,0 @@ -{% extends "ui/panels/_base.html" %} -{% load helpers i18n %} - -{% block panel_content %} - - - - - - - - - - {% include 'circuits/inc/circuit_termination_fields.html' with termination=object %} -
    {% trans "Circuit" %}{{ object.circuit|linkify|placeholder }}
    {% trans "Provider" %}{{ object.circuit.provider|linkify|placeholder }}
    -{% endblock panel_content %} diff --git a/netbox/templates/dcim/panels/installed_device.html b/netbox/templates/dcim/panels/installed_device.html deleted file mode 100644 index c95bf7f5d..000000000 --- a/netbox/templates/dcim/panels/installed_device.html +++ /dev/null @@ -1,21 +0,0 @@ -{% extends "ui/panels/_base.html" %} -{% load helpers i18n %} - -{% block panel_content %} - {% if object.installed_device %} - {% with device=object.installed_device %} - - - - - - - - - -
    {% trans "Device" %}{{ device|linkify }}
    {% trans "Device type" %}{{ device.device_type }}
    - {% endwith %} - {% else %} -
    {% trans "None" %}
    - {% endif %} -{% endblock panel_content %} diff --git a/netbox/templates/dcim/panels/installed_module.html b/netbox/templates/dcim/panels/installed_module.html deleted file mode 100644 index 8125d2a63..000000000 --- a/netbox/templates/dcim/panels/installed_module.html +++ /dev/null @@ -1,33 +0,0 @@ -{% extends "ui/panels/_base.html" %} -{% load helpers i18n %} - -{% block panel_content %} - {% if object.installed_module %} - {% with module=object.installed_module %} - - - - - - - - - - - - - - - - - - - - - -
    {% trans "Module" %}{{ module|linkify }}
    {% trans "Manufacturer" %}{{ module.module_type.manufacturer|linkify }}
    {% trans "Module type" %}{{ module.module_type|linkify }}
    {% trans "Serial number" %}{{ module.serial|placeholder }}
    {% trans "Asset tag" %}{{ module.asset_tag|placeholder }}
    - {% endwith %} - {% else %} -
    {% trans "None" %}
    - {% endif %} -{% endblock panel_content %} diff --git a/netbox/templates/generic/object.html b/netbox/templates/generic/object.html index 100d5bde7..cb7974fde 100644 --- a/netbox/templates/generic/object.html +++ b/netbox/templates/generic/object.html @@ -124,11 +124,11 @@ Context: {% block content %} {# Render panel layout declared on view class #} - {% for row in layout.rows %} + {% for row in layout %}
    - {% for column in row.columns %} -
    - {% for panel in column.panels %} + {% for column in row %} +
    + {% for panel in column %} {% render panel %} {% endfor %}
    diff --git a/netbox/templates/ui/attrs/numeric.html b/netbox/templates/ui/attrs/numeric.html index 5c54f2979..455a66c22 100644 --- a/netbox/templates/ui/attrs/numeric.html +++ b/netbox/templates/ui/attrs/numeric.html @@ -1,5 +1,5 @@ {% load i18n %} - + {{ value }} {% if unit %} {{ unit|lower }} diff --git a/netbox/templates/ui/exception.html b/netbox/templates/ui/exception.html new file mode 100644 index 000000000..a777b0b5e --- /dev/null +++ b/netbox/templates/ui/exception.html @@ -0,0 +1,12 @@ +{% load i18n %} + diff --git a/netbox/templates/ui/panels/_base.html b/netbox/templates/ui/panels/_base.html index 5128e6428..670d9fda8 100644 --- a/netbox/templates/ui/panels/_base.html +++ b/netbox/templates/ui/panels/_base.html @@ -1,15 +1,17 @@
    -

    - {{ title }} - {% if actions %} -
    - {% for action in actions %} - {% render action %} - {% endfor %} -
    - {% endif %} -

    + {% if title or actions %} +

    + {{ title|default:"" }} + {% if actions %} +
    + {% for action in actions %} + {% render action %} + {% endfor %} +
    + {% endif %} +

    + {% endif %} {% block panel_content %}{% endblock %}
    diff --git a/netbox/templates/vpn/panels/ipsecprofile_ike_policy.html b/netbox/templates/vpn/panels/ipsecprofile_ike_policy.html deleted file mode 100644 index 8b3065cfd..000000000 --- a/netbox/templates/vpn/panels/ipsecprofile_ike_policy.html +++ /dev/null @@ -1,34 +0,0 @@ -{% load helpers %} -{% load i18n %} - -
    -

    {% trans "IKE Policy" %}

    - - - - - - - - - - - - - - - - - - - - - -
    {% trans "Name" %}{{ object.ike_policy|linkify }}
    {% trans "Description" %}{{ object.ike_policy.description|placeholder }}
    {% trans "Version" %}{{ object.ike_policy.get_version_display }}
    {% trans "Mode" %}{{ object.ike_policy.get_mode_display }}
    {% trans "Proposals" %} -
      - {% for proposal in object.ike_policy.proposals.all %} -
    • {{ proposal }}
    • - {% endfor %} -
    -
    -
    diff --git a/netbox/templates/vpn/panels/ipsecprofile_ipsec_policy.html b/netbox/templates/vpn/panels/ipsecprofile_ipsec_policy.html deleted file mode 100644 index cb28c1620..000000000 --- a/netbox/templates/vpn/panels/ipsecprofile_ipsec_policy.html +++ /dev/null @@ -1,30 +0,0 @@ -{% load helpers %} -{% load i18n %} - -
    -

    {% trans "IPSec Policy" %}

    - - - - - - - - - - - - - - - - - -
    {% trans "Name" %}{{ object.ipsec_policy|linkify }}
    {% trans "Description" %}{{ object.ipsec_policy.description|placeholder }}
    {% trans "Proposals" %} -
      - {% for proposal in object.ipsec_policy.proposals.all %} -
    • {{ proposal }}
    • - {% endfor %} -
    -
    {% trans "PFS Group" %}{{ object.ipsec_policy.get_pfs_group_display }}
    -
    diff --git a/netbox/utilities/templatetags/plugins.py b/netbox/utilities/templatetags/plugins.py index 40e6b8196..c3157d119 100644 --- a/netbox/utilities/templatetags/plugins.py +++ b/netbox/utilities/templatetags/plugins.py @@ -1,5 +1,6 @@ from django import template as template_ from django.conf import settings +from django.template.loader import render_to_string from django.utils.safestring import mark_safe from netbox.plugins import PluginTemplateExtension @@ -38,8 +39,11 @@ def _get_registered_content(obj, method, template_context): context['config'] = settings.PLUGINS_CONFIG.get(plugin_name, {}) # Call the method to render content - instance = template_extension(context) - content = getattr(instance, method)() + try: + instance = template_extension(context) + content = getattr(instance, method)() + except Exception as e: + content = render_to_string('ui/exception.html', {'plugin': plugin_name, 'exception': repr(e)}) html += content return mark_safe(html) diff --git a/netbox/vpn/ui/panels.py b/netbox/vpn/ui/panels.py index 41afec132..20b3f5be9 100644 --- a/netbox/vpn/ui/panels.py +++ b/netbox/vpn/ui/panels.py @@ -71,6 +71,23 @@ class IPSecProfilePanel(panels.ObjectAttributesPanel): mode = attrs.ChoiceAttr('mode') +class IPSecProfileIKEPolicyPanel(panels.ObjectAttributesPanel): + title = _('IKE Policy') + name = attrs.RelatedObjectAttr('ike_policy', linkify=True) + description = attrs.TextAttr('ike_policy.description') + version = attrs.ChoiceAttr('ike_policy.version', label=_('IKE version')) + mode = attrs.ChoiceAttr('ike_policy.mode') + proposals = attrs.RelatedObjectListAttr('ike_policy.proposals', linkify=True) + + +class IPSecProfileIPSecPolicyPanel(panels.ObjectAttributesPanel): + title = _('IPSec Policy') + name = attrs.RelatedObjectAttr('ipsec_policy', linkify=True) + description = attrs.TextAttr('ipsec_policy.description') + proposals = attrs.RelatedObjectListAttr('ipsec_policy.proposals', linkify=True) + pfs_group = attrs.ChoiceAttr('ipsec_policy.pfs_group', label=_('PFS group')) + + class L2VPNPanel(panels.ObjectAttributesPanel): name = attrs.TextAttr('name') identifier = attrs.TextAttr('identifier') diff --git a/netbox/vpn/views.py b/netbox/vpn/views.py index e74c53b64..f365377ad 100644 --- a/netbox/vpn/views.py +++ b/netbox/vpn/views.py @@ -10,7 +10,6 @@ from netbox.ui.panels import ( ObjectsTablePanel, PluginContentPanel, RelatedObjectsPanel, - TemplatePanel, ) from netbox.views import generic from utilities.query import count_related @@ -591,8 +590,8 @@ class IPSecProfileView(generic.ObjectView): CommentsPanel(), ], right_panels=[ - TemplatePanel('vpn/panels/ipsecprofile_ike_policy.html'), - TemplatePanel('vpn/panels/ipsecprofile_ipsec_policy.html'), + panels.IPSecProfileIKEPolicyPanel(), + panels.IPSecProfileIPSecPolicyPanel(), ], ) diff --git a/netbox/wireless/ui/panels.py b/netbox/wireless/ui/panels.py index 82fbaf51d..0135fe4bb 100644 --- a/netbox/wireless/ui/panels.py +++ b/netbox/wireless/ui/panels.py @@ -34,10 +34,10 @@ class WirelessLinkInterfacePanel(panels.ObjectPanel): self.title = title def get_context(self, context): - obj = context['object'] + ctx = super().get_context(context) return { - **super().get_context(context), - 'interface': getattr(obj, self.interface_attr), + **ctx, + 'interface': getattr(ctx['object'], self.interface_attr), } From 06c90cb86a2f85a2b17512e1adca497c4547a2b8 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 7 Apr 2026 09:58:45 -0400 Subject: [PATCH 064/104] Closes #21847: Correct webhook documentation for deprecated keys (#21848) --- docs/integrations/webhooks.md | 21 ++++++++++++++++----- docs/plugins/development/webhooks.md | 7 ++++--- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/docs/integrations/webhooks.md b/docs/integrations/webhooks.md index 3394f87a7..fe5d15b9b 100644 --- a/docs/integrations/webhooks.md +++ b/docs/integrations/webhooks.md @@ -26,15 +26,20 @@ The following data is available as context for Jinja2 templates: * `event` - The type of event which triggered the webhook: `created`, `updated`, or `deleted`. * `timestamp` - The time at which the event occurred (in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format). * `object_type` - The NetBox model which triggered the change in the form `app_label.model_name`. -* `username` - The name of the user account associated with the change. -* `request_id` - The unique request ID. This may be used to correlate multiple changes associated with a single request. +* `request` - Data about the triggering request (if available). + * `request.id` - The UUID associated with the request + * `request.method` - The HTTP method (e.g. `GET` or `POST`) + * `request.path` - The URL path (ex: `/dcim/sites/123/edit/`) + * `request.user` - The name of the authenticated user who made the request (if available) * `data` - A detailed representation of the object in its current state. This is typically equivalent to the model's representation in NetBox's REST API. * `snapshots` - Minimal "snapshots" of the object state both before and after the change was made; provided as a dictionary with keys named `prechange` and `postchange`. These are not as extensive as the fully serialized representation, but contain enough information to convey what has changed. +* ⚠️ `request_id` - The unique request ID. This may be used to correlate multiple changes associated with a single request. +* ⚠️ `username` - The name of the user account associated with the change. -!!! warning "Deprecation of legacy fields" - The "request_id" and "username" fields in the webhook payload above are deprecated and should no longer be used. Support for them will be removed in NetBox v4.7.0. +!!! warning "Deprecation of legacy keys" + The `request_id` and `username` keys in the webhook payload above are deprecated and should no longer be used. Support for them will be removed in NetBox v4.7.0. - Use `request.user.username` and `request.request_id` from the `request` object included in the callback context instead. + Use `request.user` and `request.id` from the `request` object included in the callback context instead. ### Default Request Body @@ -61,6 +66,12 @@ If no body template is specified, the request body will be populated with a JSON "region": null, ... }, + "request": { + "id": "17af32f0-852a-46ca-a7d4-33ecd0c13de6", + "method": "POST", + "path": "/dcim/sites/add/", + "user": "jstretch" + }, "snapshots": { "prechange": null, "postchange": { diff --git a/docs/plugins/development/webhooks.md b/docs/plugins/development/webhooks.md index 5d98ab620..4771e4c3b 100644 --- a/docs/plugins/development/webhooks.md +++ b/docs/plugins/development/webhooks.md @@ -36,6 +36,7 @@ The resulting webhook payload will look like the following: "url": "/api/dcim/sites/2/", ... }, + "request": {...}, "snapshots": {...}, "context": { "foo": 123 @@ -43,10 +44,10 @@ The resulting webhook payload will look like the following: } ``` -!!! warning "Deprecation of legacy fields" - The "request_id" and "username" fields in the webhook payload above are deprecated and should no longer be used. Support for them will be removed in NetBox v4.7.0. +!!! warning "Deprecation of legacy keys" + The `request_id` and `username` keys in the webhook payload above are deprecated and should no longer be used. Support for them will be removed in NetBox v4.7.0. - Use `request.user.username` and `request.request_id` from the `request` object included in the callback context instead. + Use `request.user` and `request.id` from the `request` object included in the callback context instead. !!! note "Consider namespacing webhook data" The data returned from all webhook callbacks will be compiled into a single `context` dictionary. Any existing keys within this dictionary will be overwritten by subsequent callbacks which include those keys. To avoid collisions with webhook data provided by other plugins, consider namespacing your plugin's data within a nested dictionary as such: From 48e790c9f029a9f3d52dacc942a9b9904833ae65 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 7 Apr 2026 10:26:26 -0400 Subject: [PATCH 065/104] #21409: Disable CHANGELOG_RETAIN_CREATE_LAST_UPDATE by default (#21849) --- docs/configuration/miscellaneous.md | 6 +----- netbox/netbox/config/parameters.py | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/docs/configuration/miscellaneous.md b/docs/configuration/miscellaneous.md index 2de8a861d..048f72452 100644 --- a/docs/configuration/miscellaneous.md +++ b/docs/configuration/miscellaneous.md @@ -77,7 +77,7 @@ This data enables the project maintainers to estimate how many NetBox deployment !!! tip "Dynamic Configuration Parameter" -Default: `True` +Default: `False` When pruning expired changelog entries (per `CHANGELOG_RETENTION`), retain each non-deleted object's original `create` change record and its most recent `update` change record. If an object has a `delete` change record, its changelog @@ -88,10 +88,6 @@ entries are pruned normally according to `CHANGELOG_RETENTION`. exempt from pruning. All other changelog records (including intermediate `update` records and all `delete` records) remain subject to pruning per `CHANGELOG_RETENTION`. -!!! warning - This setting is enabled by default. Upgrading deployments that rely on complete pruning of expired changelog entries - should explicitly set `CHANGELOG_RETAIN_CREATE_LAST_UPDATE = False` to preserve the previous behavior. - --- ## CHANGELOG_RETENTION diff --git a/netbox/netbox/config/parameters.py b/netbox/netbox/config/parameters.py index 80081509a..0c9975941 100644 --- a/netbox/netbox/config/parameters.py +++ b/netbox/netbox/config/parameters.py @@ -186,7 +186,7 @@ PARAMS = ( ConfigParam( name='CHANGELOG_RETAIN_CREATE_LAST_UPDATE', label=_('Retain create & last update changelog records'), - default=True, + default=False, description=_( "Retain each object's create record and most recent update record when pruning expired changelog entries " "(excluding objects with a delete record)." From 87bc20cdd5c6232208e6eca66bfad12df065c18d Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 7 Apr 2026 12:04:42 -0400 Subject: [PATCH 066/104] Add default ordering index for ipam.VLANGroup --- netbox/ipam/migrations/0089_default_ordering_indexes.py | 4 ++++ netbox/ipam/models/vlans.py | 1 + 2 files changed, 5 insertions(+) diff --git a/netbox/ipam/migrations/0089_default_ordering_indexes.py b/netbox/ipam/migrations/0089_default_ordering_indexes.py index 9407fbce1..13a43f4de 100644 --- a/netbox/ipam/migrations/0089_default_ordering_indexes.py +++ b/netbox/ipam/migrations/0089_default_ordering_indexes.py @@ -36,6 +36,10 @@ class Migration(migrations.Migration): model_name='service', index=models.Index(fields=['protocol', 'ports', 'id'], name='ipam_servic_protoco_687d13_idx'), ), + migrations.AddIndex( + model_name='vlangroup', + index=models.Index(fields=['name', 'id'], name='ipam_vlangr_name_ffa83e_idx'), + ), migrations.AddIndex( model_name='vlan', index=models.Index(fields=['site', 'group', 'vid', 'id'], name='ipam_vlan_site_id_985573_idx'), diff --git a/netbox/ipam/models/vlans.py b/netbox/ipam/models/vlans.py index 44ce3911e..554e7487a 100644 --- a/netbox/ipam/models/vlans.py +++ b/netbox/ipam/models/vlans.py @@ -76,6 +76,7 @@ class VLANGroup(OrganizationalModel): class Meta: ordering = ('name', 'pk') # Name may be non-unique indexes = ( + models.Index(fields=('name', 'id')), # Default ordering models.Index(fields=('scope_type', 'scope_id')), ) constraints = ( From 7462e45c8e70417331795a50db49bba21afb71c2 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 9 Apr 2026 13:19:25 -0400 Subject: [PATCH 067/104] Closes #21865: Display debug toolbar if `INTERNAL_IPS` is empty (#21871) --- docs/configuration/development.md | 6 +++--- docs/configuration/system.md | 7 +++++++ netbox/netbox/configuration_example.py | 4 ---- netbox/netbox/settings.py | 4 ++++ netbox/utilities/debug.py | 24 ++++++++++++++++++++++++ 5 files changed, 38 insertions(+), 7 deletions(-) create mode 100644 netbox/utilities/debug.py diff --git a/docs/configuration/development.md b/docs/configuration/development.md index a76fb80b0..de6969800 100644 --- a/docs/configuration/development.md +++ b/docs/configuration/development.md @@ -4,9 +4,9 @@ Default: `False` -This setting enables debugging. Debugging should be enabled only during development or troubleshooting. Note that only -clients which access NetBox from a recognized [internal IP address](./system.md#internal_ips) will see debugging tools in the user -interface. +This setting enables debugging and displays a debugging toolbar in the user interface. Debugging should be enabled only during development or troubleshooting. + +Note that the debugging toolbar will be displayed only for requests originating from [internal IP addresses](./system.md#internal_ips), if defined. If no internal IPs are defined, the toolbar will be displayed for all requests. !!! warning Never enable debugging on a production system, as it can expose sensitive data to unauthenticated users and impose a diff --git a/docs/configuration/system.md b/docs/configuration/system.md index 65019626e..2505c5fde 100644 --- a/docs/configuration/system.md +++ b/docs/configuration/system.md @@ -105,6 +105,13 @@ A list of IP addresses recognized as internal to the system, used to control the example, the debugging toolbar will be viewable only when a client is accessing NetBox from one of the listed IP addresses (and [`DEBUG`](./development.md#debug) is `True`). +!!! info "New in NetBox v4.6" + Setting this parameter to an empty list will enable the toolbar for all requests provided debugging is enabled: + + ```python + INTERNAL_IPS = [] + ``` + --- ## ISOLATED_DEPLOYMENT diff --git a/netbox/netbox/configuration_example.py b/netbox/netbox/configuration_example.py index 61e8c6df2..3971c69b5 100644 --- a/netbox/netbox/configuration_example.py +++ b/netbox/netbox/configuration_example.py @@ -154,10 +154,6 @@ EXEMPT_VIEW_PERMISSIONS = [ # 'https': 'http://10.10.1.10:1080', # } -# IP addresses recognized as internal to the system. The debugging toolbar will be available only to clients accessing -# NetBox from an internal IP. -INTERNAL_IPS = ('127.0.0.1', '::1') - # Enable custom logging. Please see the Django documentation for detailed guidance on configuring custom logs: # https://docs.djangoproject.com/en/stable/topics/logging/ LOGGING = {} diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 7b9a5567c..c9eee6dfd 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -587,6 +587,10 @@ SERIALIZATION_MODULES = { 'json': 'utilities.serializers.json', } +DEBUG_TOOLBAR_CONFIG = { + 'SHOW_TOOLBAR_CALLBACK': 'utilities.debug.show_toolbar', +} + # # Permissions & authentication diff --git a/netbox/utilities/debug.py b/netbox/utilities/debug.py new file mode 100644 index 000000000..842cd5a46 --- /dev/null +++ b/netbox/utilities/debug.py @@ -0,0 +1,24 @@ +from django.conf import settings +from django.http import HttpRequest + +__all__ = ( + 'show_toolbar', +) + + +def show_toolbar(request: HttpRequest) -> bool: + """ + Override django-debug-toolbar's default display conditions to allow for an empty INTERNAL_IPS. + """ + if not settings.DEBUG: + return False + + # If no internal IPs have been defined, enable the toolbar + if not settings.INTERNAL_IPS: + return True + + # If the request is from an internal IP, enable the toolbar + if request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS: + return True + + return False From ab94e3d40e3e859e92fc96759137d1df07085b3f Mon Sep 17 00:00:00 2001 From: Martin Hauser Date: Fri, 10 Apr 2026 15:19:32 +0200 Subject: [PATCH 068/104] feat(api): Include NAT IP fields in primary IP serializers Add nat_inside and nat_outside fields to primary_ip, primary_ip4, primary_ip6, and oob_ip on Device and VirtualMachine serializers. Update prefetch logic to honor field-level constraints on nested serializers and add test coverage for NAT field inclusion. Fixes #19138 --- netbox/dcim/api/serializers_/devices.py | 28 ++++++- netbox/dcim/tests/test_api.py | 83 ++++++++++++++++++- netbox/utilities/api.py | 43 +++++++--- netbox/utilities/testing/utils.py | 23 +++++ netbox/utilities/tests/test_api.py | 82 +++++++++++++++++- .../api/serializers_/virtualmachines.py | 24 ++++-- netbox/virtualization/tests/test_api.py | 52 ++++++++++++ 7 files changed, 314 insertions(+), 21 deletions(-) diff --git a/netbox/dcim/api/serializers_/devices.py b/netbox/dcim/api/serializers_/devices.py index f860c7879..51cb6c3f2 100644 --- a/netbox/dcim/api/serializers_/devices.py +++ b/netbox/dcim/api/serializers_/devices.py @@ -58,10 +58,30 @@ class DeviceSerializer(PrimaryModelSerializer): ) status = ChoiceField(choices=DeviceStatusChoices, required=False) airflow = ChoiceField(choices=DeviceAirflowChoices, allow_blank=True, required=False) - primary_ip = IPAddressSerializer(nested=True, read_only=True, allow_null=True) - primary_ip4 = IPAddressSerializer(nested=True, required=False, allow_null=True) - primary_ip6 = IPAddressSerializer(nested=True, required=False, allow_null=True) - oob_ip = IPAddressSerializer(nested=True, required=False, allow_null=True) + primary_ip = IPAddressSerializer( + nested=True, + read_only=True, + allow_null=True, + fields=[*IPAddressSerializer.Meta.brief_fields, 'nat_inside', 'nat_outside'], + ) + primary_ip4 = IPAddressSerializer( + nested=True, + required=False, + allow_null=True, + fields=[*IPAddressSerializer.Meta.brief_fields, 'nat_inside', 'nat_outside'], + ) + primary_ip6 = IPAddressSerializer( + nested=True, + required=False, + allow_null=True, + fields=[*IPAddressSerializer.Meta.brief_fields, 'nat_inside', 'nat_outside'], + ) + oob_ip = IPAddressSerializer( + nested=True, + required=False, + allow_null=True, + fields=[*IPAddressSerializer.Meta.brief_fields, 'nat_inside', 'nat_outside'], + ) parent_device = serializers.SerializerMethodField() cluster = ClusterSerializer(nested=True, required=False, allow_null=True) virtual_chassis = VirtualChassisSerializer(nested=True, required=False, allow_null=True, default=None) diff --git a/netbox/dcim/tests/test_api.py b/netbox/dcim/tests/test_api.py index 1ae90ca8e..a87ef9e32 100644 --- a/netbox/dcim/tests/test_api.py +++ b/netbox/dcim/tests/test_api.py @@ -16,7 +16,13 @@ from netbox.api.serializers import GenericObjectSerializer from tenancy.models import Tenant from users.constants import TOKEN_PREFIX from users.models import ObjectPermission, Token, User -from utilities.testing import APITestCase, APIViewTestCases, create_test_device, disable_logging +from utilities.testing import ( + APITestCase, + APIViewTestCases, + create_test_device, + create_test_nat_ip_pair, + disable_logging, +) from virtualization.models import Cluster, ClusterType from wireless.choices import WirelessChannelChoices from wireless.models import WirelessLAN @@ -1902,6 +1908,81 @@ class DeviceTest(APIViewTestCases.APIViewTestCase): response = self.client.post(url, {}, format='json', HTTP_AUTHORIZATION=token_header) self.assertHttpStatus(response, status.HTTP_200_OK) + def test_list_object_includes_nat_inside_on_primary_ip(self): + device = create_test_device('natted-device') + interface = Interface.objects.create(device=device, name='eth0', type='other') + + real_ip, nat_ip = create_test_nat_ip_pair( + real_address='10.0.0.10/32', + nat_address='198.51.100.10/32', + inside_interface=interface, + ) + + device.primary_ip4 = nat_ip + device.save() + + self.add_permissions('dcim.view_device', 'ipam.view_ipaddress') + response = self.client.get(f'{self._get_list_url()}?id={device.pk}', **self.header) + self.assertHttpStatus(response, status.HTTP_200_OK) + + result = response.data['results'][0] + for field in ('primary_ip', 'primary_ip4'): + self.assertEqual(result[field]['address'], str(nat_ip.address)) + self.assertEqual(result[field]['nat_inside']['address'], str(real_ip.address)) + self.assertEqual(result[field]['nat_outside'], []) + + def test_get_object_includes_nat_outside_on_primary_ip(self): + device = create_test_device('real-ip-device') + interface = Interface.objects.create(device=device, name='eth0', type='other') + + real_ip, nat_ip = create_test_nat_ip_pair( + real_address='10.0.0.11/32', + nat_address='198.51.100.11/32', + inside_interface=interface, + ) + + device.primary_ip4 = real_ip + device.save() + + self.add_permissions('dcim.view_device', 'ipam.view_ipaddress') + response = self.client.get( + f'{self._get_detail_url(device)}?exclude=config_context', + **self.header, + ) + self.assertHttpStatus(response, status.HTTP_200_OK) + + for field in ('primary_ip', 'primary_ip4'): + self.assertEqual(response.data[field]['address'], str(real_ip.address)) + self.assertIsNone(response.data[field]['nat_inside']) + self.assertCountEqual( + [ip['address'] for ip in response.data[field]['nat_outside']], + [str(nat_ip.address)], + ) + + def test_get_object_includes_nat_on_oob_ip(self): + device = create_test_device('oob-nat-device') + interface = Interface.objects.create(device=device, name='oob0', type='other') + + real_ip, nat_ip = create_test_nat_ip_pair( + real_address='10.0.0.12/32', + nat_address='198.51.100.12/32', + inside_interface=interface, + ) + + device.oob_ip = nat_ip + device.save() + + self.add_permissions('dcim.view_device', 'ipam.view_ipaddress') + response = self.client.get( + f'{self._get_detail_url(device)}?exclude=config_context', + **self.header, + ) + self.assertHttpStatus(response, status.HTTP_200_OK) + + self.assertEqual(response.data['oob_ip']['address'], str(nat_ip.address)) + self.assertEqual(response.data['oob_ip']['nat_inside']['address'], str(real_ip.address)) + self.assertEqual(response.data['oob_ip']['nat_outside'], []) + class ModuleTest(APIViewTestCases.APIViewTestCase): model = Module diff --git a/netbox/utilities/api.py b/netbox/utilities/api.py index 076ce3b0c..9c6b1c08c 100644 --- a/netbox/utilities/api.py +++ b/netbox/utilities/api.py @@ -11,7 +11,7 @@ from django.urls import reverse from django.utils.module_loading import import_string from django.utils.translation import gettext_lazy as _ from rest_framework.permissions import BasePermission -from rest_framework.serializers import Serializer +from rest_framework.serializers import ListSerializer, Serializer from rest_framework.views import get_view_name as drf_get_view_name from extras.constants import HTTP_CONTENT_TYPE_JSON @@ -98,6 +98,30 @@ def get_view_name(view): return drf_get_view_name(view) +def _get_nested_serializer(serializer_field): + """ + Return the nested serializer instance for a declared serializer field. + """ + if isinstance(serializer_field, ListSerializer): + serializer_field = serializer_field.child + + if isinstance(serializer_field, Serializer) and hasattr(serializer_field, 'nested'): + return serializer_field + + return None + + +def _get_serializer_fields(serializer: Serializer): + """ + Return the effective field names for a serializer instance, honoring any + field-level fields=/omit= overrides. + """ + fields = getattr(serializer, '_include_fields', None) or serializer.Meta.fields + omit = getattr(serializer, '_omit_fields', []) or [] + + return [field_name for field_name in fields if field_name not in omit] + + def get_prefetches_for_serializer(serializer_class, fields=None, omit=None): """ Compile and return a list of fields which should be prefetched on the queryset for a serializer. @@ -119,7 +143,7 @@ def get_prefetches_for_serializer(serializer_class, fields=None, omit=None): # Determine the name of the model field referenced by the serializer field model_field_name = field_name - if serializer_field and serializer_field.source: + if serializer_field and getattr(serializer_field, 'source', None): model_field_name = serializer_field.source # If the serializer field does not map to a discrete model field, skip it. @@ -130,14 +154,13 @@ def get_prefetches_for_serializer(serializer_class, fields=None, omit=None): except FieldDoesNotExist: continue - # If this field is represented by a nested serializer, recurse to resolve prefetches - # for the related object. - if serializer_field: - if issubclass(type(serializer_field), Serializer): - # Determine which fields to prefetch for the nested object - subfields = serializer_field.Meta.brief_fields if serializer_field.nested else None - for subfield in get_prefetches_for_serializer(type(serializer_field), subfields): - prefetch_fields.append(f'{field_name}__{subfield}') + # If this field is represented by a nested serializer, recurse to resolve + # prefetches for the related object, honoring any field-level fields=/omit= + # constraints set on that serializer field instance. + if nested_serializer := _get_nested_serializer(serializer_field): + subfields = _get_serializer_fields(nested_serializer) + for subfield in get_prefetches_for_serializer(type(nested_serializer), fields=subfields): + prefetch_fields.append(f'{field.name}__{subfield}') return prefetch_fields diff --git a/netbox/utilities/testing/utils.py b/netbox/utilities/testing/utils.py index 7715daa39..34bf8a336 100644 --- a/netbox/utilities/testing/utils.py +++ b/netbox/utilities/testing/utils.py @@ -12,6 +12,7 @@ from core.models import ObjectType from dcim.models import Device, DeviceRole, DeviceType, Manufacturer, Site from extras.choices import CustomFieldTypeChoices from extras.models import CustomField, Tag +from ipam.models import IPAddress from users.models import User from virtualization.models import Cluster, ClusterType, VirtualMachine @@ -65,6 +66,28 @@ def create_test_virtualmachine(name): return virtual_machine +def create_test_nat_ip_pair( + real_address='10.0.0.10/32', nat_address='198.51.100.10/32', inside_interface=None, outside_interface=None +): + """ + Convenience method for creating an inside IP and its NAT outside IP. + + Optionally, assign either address to an Interface or VMInterface. + Returns (real_ip, nat_ip). + """ + real_ip = IPAddress(address=real_address) + if inside_interface is not None: + real_ip.assigned_object = inside_interface + real_ip.save() + + nat_ip = IPAddress(address=nat_address, nat_inside=real_ip) + if outside_interface is not None: + nat_ip.assigned_object = outside_interface + nat_ip.save() + + return real_ip, nat_ip + + def create_test_user(username='testuser', permissions=None): """ Create a User with the given permissions. diff --git a/netbox/utilities/tests/test_api.py b/netbox/utilities/tests/test_api.py index 290e98f1e..f984aac3a 100644 --- a/netbox/utilities/tests/test_api.py +++ b/netbox/utilities/tests/test_api.py @@ -8,8 +8,9 @@ from dcim.models import Region, Site from extras.choices import CustomFieldTypeChoices from extras.models import CustomField from ipam.models import VLAN +from netbox.api.serializers import BaseModelSerializer from netbox.config import get_config -from utilities.api import get_view_name +from utilities.api import get_prefetches_for_serializer, get_view_name from utilities.testing import APITestCase, disable_warnings @@ -394,3 +395,82 @@ class GetViewNameTestCase(TestCase): name = get_view_name(view) self.assertEqual(name, 'Mock List') + + +class GetPrefetchesForSerializerTestCase(TestCase): + + def test_nested_serializer_honors_explicit_fields(self): + class RegionSerializer(BaseModelSerializer): + class Meta: + model = Region + fields = ('id', 'name', 'parent') + brief_fields = ('id', 'name') + + class SiteSerializer(BaseModelSerializer): + region = RegionSerializer(nested=True, fields=('id', 'parent')) + + class Meta: + model = Site + fields = ('id', 'name', 'region') + + self.assertListEqual( + get_prefetches_for_serializer(SiteSerializer), + ['region', 'region__parent'], + ) + + def test_nested_serializer_honors_explicit_omit(self): + class RegionSerializer(BaseModelSerializer): + class Meta: + model = Region + fields = ('id', 'name', 'parent') + brief_fields = ('id', 'name') + + class SiteSerializer(BaseModelSerializer): + region = RegionSerializer(nested=True, omit=('name',)) + + class Meta: + model = Site + fields = ('id', 'name', 'region') + + self.assertListEqual( + get_prefetches_for_serializer(SiteSerializer), + ['region', 'region__parent'], + ) + + def test_many_nested_serializer_honors_explicit_fields(self): + class SiteSerializer(BaseModelSerializer): + class Meta: + model = Site + fields = ('id', 'name', 'region') + brief_fields = ('id', 'name') + + class RegionSerializer(BaseModelSerializer): + sites = SiteSerializer(nested=True, many=True, fields=('id', 'region')) + + class Meta: + model = Region + fields = ('id', 'name', 'sites') + + self.assertListEqual( + get_prefetches_for_serializer(RegionSerializer), + ['sites', 'sites__region'], + ) + + def test_nested_serializer_uses_source_for_prefetch_path(self): + class RegionSerializer(BaseModelSerializer): + class Meta: + model = Region + fields = ('id', 'name', 'parent') + brief_fields = ('id', 'name') + + class SiteSerializer(BaseModelSerializer): + region_detail = RegionSerializer(source='region', nested=True, fields=('id', 'parent')) + + class Meta: + model = Site + fields = ('id', 'name', 'region_detail') + + self.assertListEqual( + get_prefetches_for_serializer(SiteSerializer), + ['region', 'region__parent'], + ) diff --git a/netbox/virtualization/api/serializers_/virtualmachines.py b/netbox/virtualization/api/serializers_/virtualmachines.py index ac2621511..cfb01e9c3 100644 --- a/netbox/virtualization/api/serializers_/virtualmachines.py +++ b/netbox/virtualization/api/serializers_/virtualmachines.py @@ -1,8 +1,7 @@ from drf_spectacular.utils import extend_schema_field from rest_framework import serializers -from dcim.api.serializers_.device_components import MACAddressSerializer -from dcim.api.serializers_.devices import DeviceSerializer +from dcim.api.serializers_.devices import DeviceSerializer, MACAddressSerializer from dcim.api.serializers_.platforms import PlatformSerializer from dcim.api.serializers_.roles import DeviceRoleSerializer from dcim.api.serializers_.sites import SiteSerializer @@ -58,9 +57,24 @@ class VirtualMachineSerializer(PrimaryModelSerializer): role = DeviceRoleSerializer(nested=True, required=False, allow_null=True) tenant = TenantSerializer(nested=True, required=False, allow_null=True, default=None) platform = PlatformSerializer(nested=True, required=False, allow_null=True) - primary_ip = IPAddressSerializer(nested=True, read_only=True, allow_null=True) - primary_ip4 = IPAddressSerializer(nested=True, required=False, allow_null=True) - primary_ip6 = IPAddressSerializer(nested=True, required=False, allow_null=True) + primary_ip = IPAddressSerializer( + nested=True, + read_only=True, + allow_null=True, + fields=[*IPAddressSerializer.Meta.brief_fields, 'nat_inside', 'nat_outside'], + ) + primary_ip4 = IPAddressSerializer( + nested=True, + required=False, + allow_null=True, + fields=[*IPAddressSerializer.Meta.brief_fields, 'nat_inside', 'nat_outside'], + ) + primary_ip6 = IPAddressSerializer( + nested=True, + required=False, + allow_null=True, + fields=[*IPAddressSerializer.Meta.brief_fields, 'nat_inside', 'nat_outside'], + ) config_template = ConfigTemplateSerializer(nested=True, required=False, allow_null=True, default=None) # Counter fields diff --git a/netbox/virtualization/tests/test_api.py b/netbox/virtualization/tests/test_api.py index e7137d27e..6cfa60963 100644 --- a/netbox/virtualization/tests/test_api.py +++ b/netbox/virtualization/tests/test_api.py @@ -18,6 +18,7 @@ from utilities.testing import ( APITestCase, APIViewTestCases, create_test_device, + create_test_nat_ip_pair, create_test_virtualmachine, disable_logging, ) @@ -505,6 +506,57 @@ class VirtualMachineTest(APIViewTestCases.APIViewTestCase): response = self.client.post(url, {}, format='json', HTTP_AUTHORIZATION=token_header) self.assertHttpStatus(response, status.HTTP_200_OK) + def test_list_object_includes_nat_inside_on_primary_ip(self): + virtualmachine = create_test_virtualmachine('natted-vm') + interface = VMInterface.objects.create(virtual_machine=virtualmachine, name='eth0') + + real_ip, nat_ip = create_test_nat_ip_pair( + real_address='10.0.1.10/32', + nat_address='198.51.100.20/32', + inside_interface=interface, + ) + + virtualmachine.primary_ip4 = nat_ip + virtualmachine.save() + + self.add_permissions('virtualization.view_virtualmachine', 'ipam.view_ipaddress') + response = self.client.get(f'{self._get_list_url()}?id={virtualmachine.pk}', **self.header) + self.assertHttpStatus(response, status.HTTP_200_OK) + + result = response.data['results'][0] + for field in ('primary_ip', 'primary_ip4'): + self.assertEqual(result[field]['address'], str(nat_ip.address)) + self.assertEqual(result[field]['nat_inside']['address'], str(real_ip.address)) + self.assertEqual(result[field]['nat_outside'], []) + + def test_get_object_includes_nat_outside_on_primary_ip(self): + virtualmachine = create_test_virtualmachine('real-ip-vm') + interface = VMInterface.objects.create(virtual_machine=virtualmachine, name='eth0') + + real_ip, nat_ip = create_test_nat_ip_pair( + real_address='10.0.1.11/32', + nat_address='198.51.100.21/32', + inside_interface=interface, + ) + + virtualmachine.primary_ip4 = real_ip + virtualmachine.save() + + self.add_permissions('virtualization.view_virtualmachine', 'ipam.view_ipaddress') + response = self.client.get( + f'{self._get_detail_url(virtualmachine)}?exclude=config_context', + **self.header, + ) + self.assertHttpStatus(response, status.HTTP_200_OK) + + for field in ('primary_ip', 'primary_ip4'): + self.assertEqual(response.data[field]['address'], str(real_ip.address)) + self.assertIsNone(response.data[field]['nat_inside']) + self.assertCountEqual( + [ip['address'] for ip in response.data[field]['nat_outside']], + [str(nat_ip.address)], + ) + class VMInterfaceTest(APIViewTestCases.APIViewTestCase): model = VMInterface From 133ed538490462fb07937818a6d352d51ab08efc Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 10 Apr 2026 16:35:58 -0400 Subject: [PATCH 069/104] Closes #21881: Deprecate legacy Sentry configuration parameters (#21882) --- netbox/netbox/settings.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 67ed887c2..67fe807b4 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -180,15 +180,15 @@ SECURE_HSTS_PRELOAD = getattr(configuration, 'SECURE_HSTS_PRELOAD', False) SECURE_HSTS_SECONDS = getattr(configuration, 'SECURE_HSTS_SECONDS', 0) SECURE_SSL_REDIRECT = getattr(configuration, 'SECURE_SSL_REDIRECT', False) SENTRY_CONFIG = getattr(configuration, 'SENTRY_CONFIG', {}) -# TODO: Remove in NetBox v4.5 +# TODO: Remove in NetBox v4.7 SENTRY_DSN = getattr(configuration, 'SENTRY_DSN', None) SENTRY_ENABLED = getattr(configuration, 'SENTRY_ENABLED', False) -# TODO: Remove in NetBox v4.5 +# TODO: Remove in NetBox v4.7 SENTRY_SAMPLE_RATE = getattr(configuration, 'SENTRY_SAMPLE_RATE', 1.0) -# TODO: Remove in NetBox v4.5 +# TODO: Remove in NetBox v4.7 SENTRY_SEND_DEFAULT_PII = getattr(configuration, 'SENTRY_SEND_DEFAULT_PII', False) SENTRY_TAGS = getattr(configuration, 'SENTRY_TAGS', {}) -# TODO: Remove in NetBox v4.5 +# TODO: Remove in NetBox v4.7 SENTRY_TRACES_SAMPLE_RATE = getattr(configuration, 'SENTRY_TRACES_SAMPLE_RATE', 0) SESSION_COOKIE_NAME = getattr(configuration, 'SESSION_COOKIE_NAME', 'sessionid') SESSION_COOKIE_PATH = CSRF_COOKIE_PATH @@ -620,6 +620,11 @@ MAINTENANCE_EXEMPT_PATHS = ( # Sentry # +# Warn on the presence of deprecated Sentry config parameters +for config_param in ('SENTRY_DSN', 'SENTRY_SAMPLE_RATE', 'SENTRY_SEND_DEFAULT_PII', 'SENTRY_TRACES_SAMPLE_RATE'): + if hasattr(configuration, config_param): + warnings.warn(f"{config_param} is deprecated and will be removed in NetBox v4.7. Use SENTRY_CONFIG instead.") + if SENTRY_ENABLED: try: import sentry_sdk From 82cf60091a46f38609fdce775de60fdc31915bb2 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 10 Apr 2026 16:24:01 -0400 Subject: [PATCH 070/104] Closes #21884: Deprecate the DEFAULT_ACTION_PERMISSIONS constant --- netbox/netbox/constants.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/netbox/netbox/constants.py b/netbox/netbox/constants.py index a0ba966d7..efe42c383 100644 --- a/netbox/netbox/constants.py +++ b/netbox/netbox/constants.py @@ -44,9 +44,9 @@ ADVISORY_LOCK_KEYS = { 'job-schedules': 110100, } -# TODO: Remove in NetBox v4.5 +# TODO: Remove in NetBox v4.7 # Legacy default view action permission mapping -DEFAULT_ACTION_PERMISSIONS = { +_DEFAULT_ACTION_PERMISSIONS = { 'add': {'add'}, 'export': {'view'}, 'bulk_import': {'add'}, @@ -54,6 +54,20 @@ DEFAULT_ACTION_PERMISSIONS = { 'bulk_delete': {'delete'}, } + +def __getattr__(name): + if name == 'DEFAULT_ACTION_PERMISSIONS': + import warnings + warnings.warn( + f"{name} is deprecated and will be removed in NetBox v4.7. " + "Define action permissions via ObjectAction subclasses instead.", + DeprecationWarning, + stacklevel=2, + ) + return _DEFAULT_ACTION_PERMISSIONS + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") + + # General-purpose tokens CENSOR_TOKEN = '********' CENSOR_TOKEN_CHANGED = '***CHANGED***' From 71d918636cc29ea932b584faa1a8b2ea0f0894b3 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 10 Apr 2026 17:10:11 -0400 Subject: [PATCH 071/104] Remove cancelled TODO --- netbox/core/models/object_types.py | 1 - 1 file changed, 1 deletion(-) diff --git a/netbox/core/models/object_types.py b/netbox/core/models/object_types.py index bb18f50b6..78847f912 100644 --- a/netbox/core/models/object_types.py +++ b/netbox/core/models/object_types.py @@ -51,7 +51,6 @@ class ObjectTypeManager(models.Manager): """ return self.get(app_label=app_label, model=model) - # TODO: Remove in NetBox v4.5 def get_for_id(self, id): """ Retrieve an ObjectType by its primary key (numeric ID). From cb5ade07f0c71e97ddb2f02d84f387a9daf55ab6 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 10 Apr 2026 18:55:27 -0400 Subject: [PATCH 072/104] Closes #21887: Deprecate support for legacy view actions (#21889) --- netbox/netbox/views/generic/mixins.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/netbox/netbox/views/generic/mixins.py b/netbox/netbox/views/generic/mixins.py index 6e40e4175..2945e0e33 100644 --- a/netbox/netbox/views/generic/mixins.py +++ b/netbox/netbox/views/generic/mixins.py @@ -9,7 +9,7 @@ __all__ = ( 'TableMixin', ) -# TODO: Remove in NetBox v4.5 +# TODO: Remove in NetBox v4.7 LEGACY_ACTIONS = { 'add': object_actions.AddObject, 'edit': object_actions.EditObject, @@ -33,7 +33,7 @@ class ActionsMixin: """ actions = tuple() - # TODO: Remove in NetBox v4.5 + # TODO: Remove in NetBox v4.7 def _convert_legacy_actions(self): """ Convert a legacy dictionary mapping action name to required permissions to a list of ObjectAction subclasses. @@ -41,6 +41,14 @@ class ActionsMixin: if type(self.actions) is not dict: return + import warnings + warnings.warn( + f"{self.__class__.__name__}.actions is defined as a dictionary, which is deprecated and will be removed " + "in NetBox v4.7. Define actions as a list of ObjectAction subclasses instead.", + DeprecationWarning, + stacklevel=2, + ) + actions = [] for name in self.actions.keys(): try: @@ -56,7 +64,7 @@ class ActionsMixin: """ model = model or self.queryset.model - # TODO: Remove in NetBox v4.5 + # TODO: Remove in NetBox v4.7 # Handle legacy action sets self._convert_legacy_actions() From 28a11f6aad4604c70ad6601a1f8d8f9df5059120 Mon Sep 17 00:00:00 2001 From: Jason Novinger Date: Mon, 13 Apr 2026 07:37:09 -0500 Subject: [PATCH 073/104] Fixes #21357: Add support for registering custom model actions (#21560) * Add ModelAction and register_model_actions() API for custom permission actions * Add ObjectTypeSplitMultiSelectWidget and RegisteredActionsWidget * Integrate registered actions into ObjectPermissionForm * Add JavaScript for registered actions show/hide * Register custom actions for DataSource, Device, and VirtualMachine * Add tests for ModelAction and register_model_actions * Refine registered actions widget UI - Use verbose labels (App | Model) for action group headers - Simplify template layout with h5 headers instead of cards - Consolidate Standard/Custom/Additional Actions into single Actions fieldset * Hide custom actions field when no applicable models selected The entire field row is now hidden when no selected object types have registered custom actions, avoiding an empty "Custom actions" label. * Add documentation for custom model actions - Add plugin development guide for registering custom actions - Update admin permissions docs to mention custom actions UI - Add docstrings to ModelAction and register_model_actions * Add RESERVED_ACTIONS constant and fix dedup in registered actions - Define RESERVED_ACTIONS in users/constants.py for the four built-in permission actions (view, add, change, delete) - Replace hardcoded action lists in ObjectPermissionForm with the constant - Fix duplicate action names in clean() when the same action is registered across multiple models (e.g. render_config for Device and VirtualMachine) - Fix template substring matching bug in objectpermission.html detail view by passing RESERVED_ACTIONS through view context for proper list membership * Fix shared action pre-selection and additional actions leakage on edit * Prevent duplicate action registration in register_model_actions() * Remove stale comment in RegisteredActionsWidget * Rebuild frontend assets after rebase onto feature * Refactor SplitMultiSelectWidget to use class attributes for widget classes * Reject reserved action names in register_model_actions() * Show all registered actions with enable/disable instead of show/hide * Validate action name is not empty and clarify RESERVED_ACTIONS origin * Adapt custom actions panel for declarative layout system Convert the ObjectPermission detail view to use the new panel-based layout from #21568. Add ObjectPermissionCustomActionsPanel that cross-references assigned object types with the model_actions registry to display which models each custom action applies to. Also fix dark-mode visibility of disabled action checkboxes in the permission form by overriding Bootstrap's disabled opacity. * Flatten registered actions UI and declare via Meta.permissions Implement two changes requested in review of #21560: 1. Use Meta.permissions for action declaration - Add Meta.permissions to DataSource, Device, and VirtualMachine - register_models() auto-registers actions from Meta.permissions - Remove explicit register_model_actions() calls from apps.py - Add get_action_model_map() utility to utilities/permissions.py 2. Flatten the ObjectPermission form UI - Show a single deduplicated list of action checkboxes (one per unique action name) instead of grouped-by-model checkboxes - RegisteredActionsWidget uses create_option() to inject model_keys and help_text; JS enables/disables based on selected object types - render_field.html bypasses outer wrapper for registeredactionswidget so widget emits rows with identical DOM structure to CRUD checkboxes - Unchecking a model now also unchecks unsupported action checkboxes Fixes #21357 * Address review feedback on registered actions - Sort model_keys in data-models attribute for deterministic output - Rename registered_actions field label to 'Registered actions' - Target object_types selected list via data-object-types-selected attribute instead of hardcoded DOM ID - Reduce setTimeout delay to 0ms since moveOption() is synchronous * Consolidate ObjectPermission detail view actions panel Merge ObjectPermissionActionsPanel and ObjectPermissionCustomActionsPanel into a single Actions panel that shows CRUD booleans and all registered actions in one table, matching the form's consolidated layout. Also fix data-object-types-selected attribute value (True -> 'true') and update plugin docs to show Meta.permissions as the primary registration approach. * Address additional bot review feedback - clean() collects all validation errors before raising instead of stopping at the first - Fix stale admin docs (still referenced "Custom actions" and "grouped by model") * Update netbox/netbox/registry.py Co-authored-by: Jeremy Stretch * Fix model_actions registry to use set operations The registry was changed to defaultdict(set) but the registration code still used list methods. Update .append() to .add() and fix tests to use set-compatible access patterns. * Rename permission migrations for clarity * Move ModelAction validation into __post_init__ * Drop model name from permission descriptions * Simplify ObjectPermission form and remove custom widgets Replace the dynamic UI with standard BooleanField checkboxes for each registered action. No custom widgets, no JavaScript, no template changes. - Remove RegisteredActionsWidget, ObjectTypeSplitMultiSelectWidget, and registeredActions.ts - Use dynamic BooleanFields for registered actions (renders identically to CRUD checkboxes) - Move action-resolution logic from panel to ObjectPermission model - Remove object-type cross-validation from form clean() - Remove unused get_action_model_map utility * Remove register_model_actions from public API Meta.permissions is the documented approach for plugins. The register_model_actions function is now an internal implementation detail. * Sort registered actions and improve test coverage Sort action names alphabetically for stable display order. Add tests for cloning, empty registry, and models_csv output. * Add help_text to registered action checkboxes * Return model_keys as list from get_registered_actions() Move string joining to the template so callers get native list data instead of a pre-formatted CSV string. * Improve detail view: human-friendly descriptions and additional actions Return dicts from get_registered_actions() with help_text and verbose model names. Add get_additional_actions() for manually-entered actions that aren't CRUD or registered. Show both in the Actions panel. * Renumber permission migrations after feature merge Resolve migration conflicts with default_ordering_indexes migrations. Renumber to 0023 (core), 0232 (dcim), 0056 (virtualization) and update dependencies. --------- Co-authored-by: Jeremy Stretch --- docs/administration/permissions.md | 4 +- docs/plugins/development/permissions.md | 24 +++ mkdocs.yml | 1 + .../0023_datasource_sync_permission.py | 17 ++ netbox/core/models/data.py | 3 + .../0232_device_render_config_permission.py | 17 ++ netbox/dcim/models/devices.py | 3 + netbox/netbox/models/features.py | 10 + netbox/netbox/registry.py | 1 + netbox/templates/users/panels/actions.html | 32 +++ netbox/users/constants.py | 5 + netbox/users/forms/model_forms.py | 94 +++++++-- netbox/users/models/permissions.py | 52 +++++ netbox/users/ui/panels.py | 23 +- netbox/utilities/forms/widgets/select.py | 6 +- netbox/utilities/permissions.py | 51 ++++- netbox/utilities/tests/test_permissions.py | 199 ++++++++++++++++++ ...virtualmachine_render_config_permission.py | 17 ++ .../virtualization/models/virtualmachines.py | 3 + 19 files changed, 538 insertions(+), 24 deletions(-) create mode 100644 docs/plugins/development/permissions.md create mode 100644 netbox/core/migrations/0023_datasource_sync_permission.py create mode 100644 netbox/dcim/migrations/0232_device_render_config_permission.py create mode 100644 netbox/templates/users/panels/actions.html create mode 100644 netbox/utilities/tests/test_permissions.py create mode 100644 netbox/virtualization/migrations/0056_virtualmachine_render_config_permission.py diff --git a/docs/administration/permissions.md b/docs/administration/permissions.md index a73eddcd8..0b7b88bcd 100644 --- a/docs/administration/permissions.md +++ b/docs/administration/permissions.md @@ -20,7 +20,9 @@ There are four core actions that can be permitted for each type of object within * **Change** - Modify an existing object * **Delete** - Delete an existing object -In addition to these, permissions can also grant custom actions that may be required by a specific model or plugin. For example, the `run` permission for scripts allows a user to execute custom scripts. These can be specified when granting a permission in the "additional actions" field. +In addition to these, permissions can also grant custom actions that may be required by a specific model or plugin. For example, the `sync` action for data sources allows a user to synchronize data from a remote source, and the `render_config` action for devices and virtual machines allows rendering configuration templates. + +Some models have registered actions that appear as checkboxes in the "Actions" section when creating or editing a permission. These are shown in a flat list alongside the built-in CRUD actions. Additional actions (such as those not yet registered by a plugin, or for backwards compatibility) can be entered manually in the "Additional actions" field. !!! note Internally, all actions granted by a permission (both built-in and custom) are stored as strings in an array field named `actions`. diff --git a/docs/plugins/development/permissions.md b/docs/plugins/development/permissions.md new file mode 100644 index 000000000..62a1ede1b --- /dev/null +++ b/docs/plugins/development/permissions.md @@ -0,0 +1,24 @@ +# Custom Model Actions + +Plugins can register custom permission actions for their models. These actions appear as checkboxes in the ObjectPermission form, making it easy for administrators to grant or restrict access to plugin-specific functionality without manually entering action names. + +For example, a plugin might define a "sync" action for a model that syncs data from an external source, or a "bypass" action that allows users to bypass certain restrictions. + +## Registering Model Actions + +The preferred way to register custom actions is via Django's `Meta.permissions` on the model class. NetBox will automatically register these as model actions when the app is loaded: + +```python +from netbox.models import NetBoxModel + +class MyModel(NetBoxModel): + # ... + + class Meta: + permissions = [ + ('sync', 'Synchronize data from external source'), + ('export', 'Export data to external system'), + ] +``` + +Once registered, these actions appear as checkboxes in a flat list when creating or editing an ObjectPermission. diff --git a/mkdocs.yml b/mkdocs.yml index 37ec0947f..c4f288ad7 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -152,6 +152,7 @@ nav: - Filters & Filter Sets: 'plugins/development/filtersets.md' - Search: 'plugins/development/search.md' - Event Types: 'plugins/development/event-types.md' + - Permissions: 'plugins/development/permissions.md' - Data Backends: 'plugins/development/data-backends.md' - Webhooks: 'plugins/development/webhooks.md' - User Interface: 'plugins/development/user-interface.md' diff --git a/netbox/core/migrations/0023_datasource_sync_permission.py b/netbox/core/migrations/0023_datasource_sync_permission.py new file mode 100644 index 000000000..8e0ce214a --- /dev/null +++ b/netbox/core/migrations/0023_datasource_sync_permission.py @@ -0,0 +1,17 @@ +# Generated by Django 5.2.11 on 2026-03-31 21:19 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0022_default_ordering_indexes'), + ] + + operations = [ + migrations.AlterModelOptions( + name='datasource', + options={'ordering': ('name',), 'permissions': [('sync', 'Synchronize data from remote source')]}, + ), + ] diff --git a/netbox/core/models/data.py b/netbox/core/models/data.py index 5555c655e..845317ee7 100644 --- a/netbox/core/models/data.py +++ b/netbox/core/models/data.py @@ -87,6 +87,9 @@ class DataSource(JobsMixin, PrimaryModel): ordering = ('name',) verbose_name = _('data source') verbose_name_plural = _('data sources') + permissions = [ + ('sync', 'Synchronize data from remote source'), + ] def __str__(self): return f'{self.name}' diff --git a/netbox/dcim/migrations/0232_device_render_config_permission.py b/netbox/dcim/migrations/0232_device_render_config_permission.py new file mode 100644 index 000000000..862e5ec21 --- /dev/null +++ b/netbox/dcim/migrations/0232_device_render_config_permission.py @@ -0,0 +1,17 @@ +# Generated by Django 5.2.11 on 2026-03-31 21:19 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('dcim', '0231_default_ordering_indexes'), + ] + + operations = [ + migrations.AlterModelOptions( + name='device', + options={'ordering': ('name', 'pk'), 'permissions': [('render_config', 'Render configuration')]}, + ), + ] diff --git a/netbox/dcim/models/devices.py b/netbox/dcim/models/devices.py index 53cde6471..88d094b97 100644 --- a/netbox/dcim/models/devices.py +++ b/netbox/dcim/models/devices.py @@ -771,6 +771,9 @@ class Device( ) verbose_name = _('device') verbose_name_plural = _('devices') + permissions = [ + ('render_config', 'Render configuration'), + ] def __str__(self): if self.label and self.asset_tag: diff --git a/netbox/netbox/models/features.py b/netbox/netbox/models/features.py index 920c8e0c1..e4dbf9112 100644 --- a/netbox/netbox/models/features.py +++ b/netbox/netbox/models/features.py @@ -25,6 +25,7 @@ from netbox.registry import registry from netbox.signals import post_clean from netbox.utils import register_model_feature from utilities.json import CustomFieldJSONEncoder +from utilities.permissions import ModelAction, register_model_actions from utilities.serialization import serialize_object __all__ = ( @@ -752,3 +753,12 @@ def register_models(*models): register_model_view(model, 'sync', kwargs={'model': model})( 'netbox.views.generic.ObjectSyncDataView' ) + + # Auto-register custom permission actions declared in Meta.permissions + if meta_permissions := getattr(model._meta, 'permissions', None): + actions = [ + ModelAction(codename, help_text=_(name)) + for codename, name in meta_permissions + ] + if actions: + register_model_actions(model, actions) diff --git a/netbox/netbox/registry.py b/netbox/netbox/registry.py index 829d0de93..d7e5988ce 100644 --- a/netbox/netbox/registry.py +++ b/netbox/netbox/registry.py @@ -28,6 +28,7 @@ registry = Registry({ 'denormalized_fields': collections.defaultdict(list), 'event_types': dict(), 'filtersets': dict(), + 'model_actions': collections.defaultdict(set), 'model_features': dict(), 'models': collections.defaultdict(set), 'plugins': dict(), diff --git a/netbox/templates/users/panels/actions.html b/netbox/templates/users/panels/actions.html new file mode 100644 index 000000000..d6ce07856 --- /dev/null +++ b/netbox/templates/users/panels/actions.html @@ -0,0 +1,32 @@ +{% extends "ui/panels/_base.html" %} +{% load helpers i18n %} + +{% block panel_content %} + + {% for label, enabled in crud_actions %} + + + + + {% endfor %} + {% for action in registered_actions %} + + + + + {% endfor %} + {% if additional_actions %} + + + + + {% endif %} +
    {{ label }}{% checkmark enabled %}
    {{ action.help_text|default:action.name }} +
    + {% checkmark action.enabled %} + {% if action.models %} + {{ action.models|join:", "|title }} + {% endif %} +
    +
    {% trans "Additional actions" %}{{ additional_actions|join:", " }}
    +{% endblock panel_content %} diff --git a/netbox/users/constants.py b/netbox/users/constants.py index 18add80cb..744ec0f92 100644 --- a/netbox/users/constants.py +++ b/netbox/users/constants.py @@ -10,6 +10,11 @@ OBJECTPERMISSION_OBJECT_TYPES = ( CONSTRAINT_TOKEN_USER = '$user' +# Django's four default model permissions. These receive special handling +# (dedicated checkboxes, model properties) and should not be registered +# as custom model actions. +RESERVED_ACTIONS = ('view', 'add', 'change', 'delete') + # API tokens TOKEN_PREFIX = 'nbt_' # Used for v2 tokens only TOKEN_KEY_LENGTH = 12 diff --git a/netbox/users/forms/model_forms.py b/netbox/users/forms/model_forms.py index 997142aa2..808bac6cb 100644 --- a/netbox/users/forms/model_forms.py +++ b/netbox/users/forms/model_forms.py @@ -14,6 +14,7 @@ from ipam.formfields import IPNetworkFormField from ipam.validators import prefix_validator from netbox.config import get_config from netbox.preferences import PREFERENCES +from netbox.registry import registry from users.choices import TokenVersionChoices from users.constants import * from users.models import * @@ -346,7 +347,7 @@ class ObjectPermissionForm(forms.ModelForm): label=_('Additional actions'), base_field=forms.CharField(), required=False, - help_text=_('Actions granted in addition to those listed above') + help_text=_('Additional actions for models which have not yet registered their own actions') ) users = DynamicModelMultipleChoiceField( label=_('Users'), @@ -370,8 +371,11 @@ class ObjectPermissionForm(forms.ModelForm): fieldsets = ( FieldSet('name', 'description', 'enabled'), - FieldSet('can_view', 'can_add', 'can_change', 'can_delete', 'actions', name=_('Actions')), FieldSet('object_types', name=_('Objects')), + FieldSet( + 'can_view', 'can_add', 'can_change', 'can_delete', 'actions', + name=_('Actions') + ), FieldSet('groups', 'users', name=_('Assignment')), FieldSet('constraints', name=_('Constraints')), ) @@ -385,6 +389,39 @@ class ObjectPermissionForm(forms.ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) + # Build dynamic BooleanFields for registered actions (deduplicated, sorted by name) + seen = {} + for model_actions in registry['model_actions'].values(): + for action in model_actions: + if action.name not in seen: + seen[action.name] = action + registered_action_names = sorted(seen) + + action_field_names = [] + for action_name in registered_action_names: + field_name = f'action_{action_name}' + self.fields[field_name] = forms.BooleanField( + required=False, + label=action_name, + help_text=seen[action_name].help_text, + ) + action_field_names.append(field_name) + + # Rebuild the Actions fieldset to include dynamic fields + if action_field_names: + self.fieldsets = ( + FieldSet('name', 'description', 'enabled'), + FieldSet('object_types', name=_('Objects')), + FieldSet( + 'can_view', 'can_add', 'can_change', 'can_delete', + *action_field_names, + 'actions', + name=_('Actions') + ), + FieldSet('groups', 'users', name=_('Assignment')), + FieldSet('constraints', name=_('Constraints')), + ) + # Make the actions field optional since the form uses it only for non-CRUD actions self.fields['actions'].required = False @@ -394,11 +431,23 @@ class ObjectPermissionForm(forms.ModelForm): self.fields['groups'].initial = self.instance.groups.values_list('id', flat=True) self.fields['users'].initial = self.instance.users.values_list('id', flat=True) - # Check the appropriate checkboxes when editing an existing ObjectPermission - for action in ['view', 'add', 'change', 'delete']: - if action in self.instance.actions: + # Work with a copy to avoid mutating the instance + remaining_actions = list(self.instance.actions) + + # Check the appropriate CRUD checkboxes + for action in RESERVED_ACTIONS: + if action in remaining_actions: self.fields[f'can_{action}'].initial = True - self.instance.actions.remove(action) + remaining_actions.remove(action) + + # Pre-select registered action checkboxes + for action_name in registered_action_names: + if action_name in remaining_actions: + self.fields[f'action_{action_name}'].initial = True + remaining_actions.remove(action_name) + + # Remaining actions go to the additional actions field + self.initial['actions'] = remaining_actions # Populate initial data for a new ObjectPermission elif self.initial: @@ -408,10 +457,15 @@ class ObjectPermissionForm(forms.ModelForm): if isinstance(self.initial['actions'], str): self.initial['actions'] = [self.initial['actions']] if cloned_actions := self.initial['actions']: - for action in ['view', 'add', 'change', 'delete']: + for action in RESERVED_ACTIONS: if action in cloned_actions: self.fields[f'can_{action}'].initial = True self.initial['actions'].remove(action) + # Pre-select registered action checkboxes from cloned data + for action_name in registered_action_names: + if action_name in cloned_actions: + self.fields[f'action_{action_name}'].initial = True + self.initial['actions'].remove(action_name) # Convert data delivered via initial data to JSON data if 'constraints' in self.initial: if type(self.initial['constraints']) is str: @@ -420,15 +474,27 @@ class ObjectPermissionForm(forms.ModelForm): def clean(self): super().clean() - object_types = self.cleaned_data.get('object_types') + object_types = self.cleaned_data.get('object_types', []) constraints = self.cleaned_data.get('constraints') - # Append any of the selected CRUD checkboxes to the actions list - if not self.cleaned_data.get('actions'): - self.cleaned_data['actions'] = list() - for action in ['view', 'add', 'change', 'delete']: - if self.cleaned_data[f'can_{action}'] and action not in self.cleaned_data['actions']: - self.cleaned_data['actions'].append(action) + # Merge all actions: registered action checkboxes, CRUD checkboxes, and additional + final_actions = [] + for key, value in self.cleaned_data.items(): + if key.startswith('action_') and value: + action_name = key[7:] + if action_name not in final_actions: + final_actions.append(action_name) + + for action in RESERVED_ACTIONS: + if self.cleaned_data.get(f'can_{action}') and action not in final_actions: + final_actions.append(action) + + if additional_actions := self.cleaned_data.get('actions'): + for action in additional_actions: + if action not in final_actions: + final_actions.append(action) + + self.cleaned_data['actions'] = final_actions # At least one action must be specified if not self.cleaned_data['actions']: diff --git a/netbox/users/models/permissions.py b/netbox/users/models/permissions.py index 3bd373ce3..d8a5eeb96 100644 --- a/netbox/users/models/permissions.py +++ b/netbox/users/models/permissions.py @@ -1,9 +1,12 @@ +from django.apps import apps from django.contrib.postgres.fields import ArrayField from django.db import models from django.urls import reverse from django.utils.translation import gettext_lazy as _ from netbox.models.features import CloningMixin +from netbox.registry import registry +from users.constants import RESERVED_ACTIONS from utilities.querysets import RestrictedQuerySet __all__ = ( @@ -85,5 +88,54 @@ class ObjectPermission(CloningMixin, models.Model): return [self.constraints] return self.constraints + def get_registered_actions(self): + """ + Return a list of dicts for all registered actions: + name: The action identifier + help_text: Human-friendly description (first registration wins) + enabled: Whether this action is enabled on this permission + models: Sorted list of human-friendly model verbose names + """ + enabled_actions = set(self.actions) - set(RESERVED_ACTIONS) + + action_info = {} + action_models = {} + for model_key, model_actions in registry['model_actions'].items(): + app_label, model_name = model_key.split('.') + try: + verbose_name = str(apps.get_model(app_label, model_name)._meta.verbose_name) + except LookupError: + verbose_name = model_key + for action in model_actions: + # First registration's help_text wins for shared action names + if action.name not in action_info: + action_info[action.name] = action + action_models.setdefault(action.name, []).append(verbose_name) + + return [ + { + 'name': name, + 'help_text': action_info[name].help_text, + 'enabled': name in enabled_actions, + 'models': sorted(action_models[name]), + } + for name in sorted(action_models) + ] + + def get_additional_actions(self): + """ + Return a sorted list of actions that are neither CRUD nor registered. + These are manually-entered actions from the "Additional actions" field. + """ + registered_names = set() + for model_actions in registry['model_actions'].values(): + for action in model_actions: + registered_names.add(action.name) + + return sorted( + a for a in self.actions + if a not in RESERVED_ACTIONS and a not in registered_names + ) + def get_absolute_url(self): return reverse('users:objectpermission', args=[self.pk]) diff --git a/netbox/users/ui/panels.py b/netbox/users/ui/panels.py index 9ee27f4a8..35a40b88b 100644 --- a/netbox/users/ui/panels.py +++ b/netbox/users/ui/panels.py @@ -45,13 +45,26 @@ class ObjectPermissionPanel(panels.ObjectAttributesPanel): enabled = attrs.BooleanAttr('enabled') -class ObjectPermissionActionsPanel(panels.ObjectAttributesPanel): +class ObjectPermissionActionsPanel(panels.ObjectPanel): + template_name = 'users/panels/actions.html' title = _('Actions') - can_view = attrs.BooleanAttr('can_view', label=_('View')) - can_add = attrs.BooleanAttr('can_add', label=_('Add')) - can_change = attrs.BooleanAttr('can_change', label=_('Change')) - can_delete = attrs.BooleanAttr('can_delete', label=_('Delete')) + def get_context(self, context): + obj = context['object'] + + crud_actions = [ + (_('View'), 'view' in obj.actions), + (_('Add'), 'add' in obj.actions), + (_('Change'), 'change' in obj.actions), + (_('Delete'), 'delete' in obj.actions), + ] + + return { + **super().get_context(context), + 'crud_actions': crud_actions, + 'registered_actions': obj.get_registered_actions(), + 'additional_actions': obj.get_additional_actions(), + } class OwnerPanel(panels.ObjectAttributesPanel): diff --git a/netbox/utilities/forms/widgets/select.py b/netbox/utilities/forms/widgets/select.py index 4e0c06211..7297f483f 100644 --- a/netbox/utilities/forms/widgets/select.py +++ b/netbox/utilities/forms/widgets/select.py @@ -150,14 +150,16 @@ class SplitMultiSelectWidget(forms.MultiWidget): be enabled only if the order of the selected choices is significant. """ template_name = 'widgets/splitmultiselect.html' + available_widget_class = AvailableOptions + selected_widget_class = SelectedOptions def __init__(self, choices, attrs=None, ordering=False): widgets = [ - AvailableOptions( + self.available_widget_class( attrs={'size': 8}, choices=choices ), - SelectedOptions( + self.selected_widget_class( attrs={'size': 8, 'class': 'select-all'}, choices=choices ), diff --git a/netbox/utilities/permissions.py b/netbox/utilities/permissions.py index 81a1ff70b..0cee1db9d 100644 --- a/netbox/utilities/permissions.py +++ b/netbox/utilities/permissions.py @@ -1,11 +1,15 @@ +from dataclasses import dataclass + from django.apps import apps from django.conf import settings -from django.db.models import Q +from django.db.models import Model, Q from django.utils.translation import gettext_lazy as _ -from users.constants import CONSTRAINT_TOKEN_USER +from netbox.registry import registry +from users.constants import CONSTRAINT_TOKEN_USER, RESERVED_ACTIONS __all__ = ( + 'ModelAction', 'get_permission_for_model', 'permission_is_exempt', 'qs_filter_from_constraints', @@ -14,6 +18,49 @@ __all__ = ( ) +@dataclass +class ModelAction: + """ + Represents a custom permission action for a model. + + Attributes: + name: The action identifier (e.g. 'sync', 'render_config') + help_text: Optional description displayed in the ObjectPermission form + """ + name: str + help_text: str = '' + + def __post_init__(self): + if not self.name: + raise ValueError("Action name must not be empty.") + if self.name in RESERVED_ACTIONS: + raise ValueError(f"'{self.name}' is a reserved action and cannot be registered.") + + def __hash__(self): + return hash(self.name) + + def __eq__(self, other): + if isinstance(other, ModelAction): + return self.name == other.name + return self.name == other + + +def register_model_actions(model: type[Model], actions: list[ModelAction | str]): + """ + Register custom permission actions for a model. These actions will appear as + checkboxes in the ObjectPermission form when the model is selected. + + Args: + model: The model class to register actions for + actions: A list of ModelAction instances or action name strings + """ + label = f'{model._meta.app_label}.{model._meta.model_name}' + for action in actions: + if isinstance(action, str): + action = ModelAction(name=action) + registry['model_actions'][label].add(action) + + def get_permission_for_model(model, action): """ Resolve the named permission for a given model (or instance) and action (e.g. view or add). diff --git a/netbox/utilities/tests/test_permissions.py b/netbox/utilities/tests/test_permissions.py new file mode 100644 index 000000000..dd4dd7cad --- /dev/null +++ b/netbox/utilities/tests/test_permissions.py @@ -0,0 +1,199 @@ +from django.test import TestCase + +from core.models import ObjectType +from dcim.models import Device, Site +from netbox.registry import registry +from users.forms.model_forms import ObjectPermissionForm +from users.models import ObjectPermission +from utilities.permissions import ModelAction, register_model_actions +from virtualization.models import VirtualMachine + + +class ModelActionTest(TestCase): + + def test_hash(self): + action1 = ModelAction(name='sync') + action2 = ModelAction(name='sync', help_text='Different help') + self.assertEqual(hash(action1), hash(action2)) + + def test_equality_with_model_action(self): + action1 = ModelAction(name='sync') + action2 = ModelAction(name='sync', help_text='Different help') + action3 = ModelAction(name='merge') + self.assertEqual(action1, action2) + self.assertNotEqual(action1, action3) + + def test_equality_with_string(self): + action = ModelAction(name='sync') + self.assertEqual(action, 'sync') + self.assertNotEqual(action, 'merge') + + def test_usable_in_set(self): + action1 = ModelAction(name='sync') + action2 = ModelAction(name='sync', help_text='Different') + action3 = ModelAction(name='merge') + actions = {action1, action2, action3} + self.assertEqual(len(actions), 2) + + +class RegisterModelActionsTest(TestCase): + + def setUp(self): + self._original_actions = dict(registry['model_actions']) + registry['model_actions'].clear() + + def tearDown(self): + registry['model_actions'].clear() + registry['model_actions'].update(self._original_actions) + + def test_register_model_action_objects(self): + register_model_actions(Site, [ + ModelAction('test_action', help_text='Test help'), + ]) + actions = registry['model_actions']['dcim.site'] + self.assertEqual(len(actions), 1) + action = next(iter(actions)) + self.assertEqual(action.name, 'test_action') + self.assertEqual(action.help_text, 'Test help') + + def test_register_string_actions(self): + register_model_actions(Site, ['action1', 'action2']) + actions = registry['model_actions']['dcim.site'] + self.assertEqual(len(actions), 2) + action_names = {a.name for a in actions} + self.assertEqual(action_names, {'action1', 'action2'}) + self.assertTrue(all(isinstance(a, ModelAction) for a in actions)) + + def test_register_mixed_actions(self): + register_model_actions(Site, [ + ModelAction('with_help', help_text='Has help'), + 'without_help', + ]) + actions = registry['model_actions']['dcim.site'] + self.assertEqual(len(actions), 2) + actions_by_name = {a.name: a for a in actions} + self.assertEqual(actions_by_name['with_help'].help_text, 'Has help') + self.assertEqual(actions_by_name['without_help'].help_text, '') + + def test_multiple_registrations_append(self): + register_model_actions(Site, [ModelAction('first')]) + register_model_actions(Site, [ModelAction('second')]) + actions = registry['model_actions']['dcim.site'] + self.assertEqual(len(actions), 2) + action_names = {a.name for a in actions} + self.assertEqual(action_names, {'first', 'second'}) + + def test_duplicate_registration_ignored(self): + register_model_actions(Site, [ModelAction('sync')]) + register_model_actions(Site, [ModelAction('sync', help_text='Different help')]) + actions = registry['model_actions']['dcim.site'] + self.assertEqual(len(actions), 1) + + def test_reserved_action_rejected(self): + for action_name in ('view', 'add', 'change', 'delete'): + with self.assertRaises(ValueError): + register_model_actions(Site, [ModelAction(action_name)]) + + def test_empty_action_name_rejected(self): + with self.assertRaises(ValueError): + register_model_actions(Site, [ModelAction('')]) + + def test_no_duplicate_action_fields(self): + register_model_actions(Device, [ModelAction('render_config')]) + register_model_actions(VirtualMachine, [ModelAction('render_config')]) + + form = ObjectPermissionForm() + action_fields = [k for k in form.fields if k.startswith('action_')] + self.assertEqual(action_fields.count('action_render_config'), 1) + + +class ObjectPermissionFormTest(TestCase): + + def setUp(self): + self._original_actions = dict(registry['model_actions']) + registry['model_actions'].clear() + + def tearDown(self): + registry['model_actions'].clear() + registry['model_actions'].update(self._original_actions) + + def test_shared_action_preselection(self): + register_model_actions(Device, [ModelAction('render_config')]) + register_model_actions(VirtualMachine, [ModelAction('render_config')]) + + device_ct = ObjectType.objects.get_for_model(Device) + vm_ct = ObjectType.objects.get_for_model(VirtualMachine) + + permission = ObjectPermission.objects.create( + name='Test Permission', + actions=['view', 'render_config'], + ) + permission.object_types.set([device_ct, vm_ct]) + + form = ObjectPermissionForm(instance=permission) + + self.assertTrue(form.fields['action_render_config'].initial) + + self.assertEqual(form.initial['actions'], []) + + permission.delete() + + def test_clean_accepts_valid_registered_action(self): + register_model_actions(Device, [ModelAction('render_config')]) + + device_ct = ObjectType.objects.get_for_model(Device) + form = ObjectPermissionForm(data={ + 'name': 'test perm', + 'object_types_0': [], + 'object_types_1': [device_ct.pk], + 'action_render_config': True, + 'can_view': True, + 'actions': '', + }) + self.assertTrue(form.is_valid(), form.errors) + self.assertIn('render_config', form.cleaned_data['actions']) + + def test_get_registered_actions(self): + register_model_actions(Device, [ModelAction('render_config')]) + register_model_actions(VirtualMachine, [ModelAction('render_config')]) + + device_ct = ObjectType.objects.get_for_model(Device) + + permission = ObjectPermission.objects.create( + name='Test Registered Actions', + actions=['view', 'render_config'], + ) + permission.object_types.set([device_ct]) + + registered = permission.get_registered_actions() + self.assertEqual(len(registered), 1) + action = registered[0] + self.assertEqual(action['name'], 'render_config') + self.assertEqual(action['help_text'], '') + self.assertTrue(action['enabled']) + self.assertEqual(action['models'], ['device', 'virtual machine']) + + permission.delete() + + def test_form_with_no_registered_actions(self): + device_ct = ObjectType.objects.get_for_model(Device) + form = ObjectPermissionForm(data={ + 'name': 'test perm', + 'object_types_0': [], + 'object_types_1': [device_ct.pk], + 'can_view': True, + 'actions': '', + }) + self.assertTrue(form.is_valid(), form.errors) + self.assertIn('view', form.cleaned_data['actions']) + action_fields = [k for k in form.fields if k.startswith('action_')] + self.assertEqual(action_fields, []) + + def test_clone_preselects_registered_actions(self): + register_model_actions(Device, [ModelAction('render_config')]) + + form = ObjectPermissionForm(initial={ + 'actions': ['view', 'render_config'], + }) + self.assertTrue(form.fields['action_render_config'].initial) + self.assertNotIn('render_config', form.initial['actions']) diff --git a/netbox/virtualization/migrations/0056_virtualmachine_render_config_permission.py b/netbox/virtualization/migrations/0056_virtualmachine_render_config_permission.py new file mode 100644 index 000000000..70ee520a6 --- /dev/null +++ b/netbox/virtualization/migrations/0056_virtualmachine_render_config_permission.py @@ -0,0 +1,17 @@ +# Generated by Django 5.2.11 on 2026-04-01 16:46 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('virtualization', '0055_default_ordering_indexes'), + ] + + operations = [ + migrations.AlterModelOptions( + name='virtualmachine', + options={'ordering': ('name', 'pk'), 'permissions': [('render_config', 'Render configuration')]}, + ), + ] diff --git a/netbox/virtualization/models/virtualmachines.py b/netbox/virtualization/models/virtualmachines.py index c5137b5a7..b47f231bf 100644 --- a/netbox/virtualization/models/virtualmachines.py +++ b/netbox/virtualization/models/virtualmachines.py @@ -282,6 +282,9 @@ class VirtualMachine( ) verbose_name = _('virtual machine') verbose_name_plural = _('virtual machines') + permissions = [ + ('render_config', 'Render configuration'), + ] def __str__(self): return self.name From 5054566abb606512b939b1711587e722f154ab83 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 13 Apr 2026 09:04:06 -0400 Subject: [PATCH 074/104] Fix migration indexes --- netbox/core/migrations/0023_datasource_sync_permission.py | 2 -- ..._permission.py => 0233_device_render_config_permission.py} | 4 +--- .../0056_virtualmachine_render_config_permission.py | 2 -- 3 files changed, 1 insertion(+), 7 deletions(-) rename netbox/dcim/migrations/{0232_device_render_config_permission.py => 0233_device_render_config_permission.py} (75%) diff --git a/netbox/core/migrations/0023_datasource_sync_permission.py b/netbox/core/migrations/0023_datasource_sync_permission.py index 8e0ce214a..3516e3020 100644 --- a/netbox/core/migrations/0023_datasource_sync_permission.py +++ b/netbox/core/migrations/0023_datasource_sync_permission.py @@ -1,5 +1,3 @@ -# Generated by Django 5.2.11 on 2026-03-31 21:19 - from django.db import migrations diff --git a/netbox/dcim/migrations/0232_device_render_config_permission.py b/netbox/dcim/migrations/0233_device_render_config_permission.py similarity index 75% rename from netbox/dcim/migrations/0232_device_render_config_permission.py rename to netbox/dcim/migrations/0233_device_render_config_permission.py index 862e5ec21..e95e250dc 100644 --- a/netbox/dcim/migrations/0232_device_render_config_permission.py +++ b/netbox/dcim/migrations/0233_device_render_config_permission.py @@ -1,12 +1,10 @@ -# Generated by Django 5.2.11 on 2026-03-31 21:19 - from django.db import migrations class Migration(migrations.Migration): dependencies = [ - ('dcim', '0231_default_ordering_indexes'), + ('dcim', '0232_default_ordering_indexes'), ] operations = [ diff --git a/netbox/virtualization/migrations/0056_virtualmachine_render_config_permission.py b/netbox/virtualization/migrations/0056_virtualmachine_render_config_permission.py index 70ee520a6..ac40852d8 100644 --- a/netbox/virtualization/migrations/0056_virtualmachine_render_config_permission.py +++ b/netbox/virtualization/migrations/0056_virtualmachine_render_config_permission.py @@ -1,5 +1,3 @@ -# Generated by Django 5.2.11 on 2026-04-01 16:46 - from django.db import migrations From 58275977bb654f2c784da2d4724e072bf5ac4abd Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 13 Apr 2026 09:24:30 -0400 Subject: [PATCH 075/104] Closes #21890: Deprecate the `models` registry key (#21892) * Closes #21890: Deprecate the 'models' registry key * Add deprecation note for 'models' key to development docs --- docs/development/application-registry.md | 3 +++ netbox/netbox/models/features.py | 6 +++--- netbox/netbox/registry.py | 10 ++++++++++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/docs/development/application-registry.md b/docs/development/application-registry.md index 9503f8ff0..7946d9df4 100644 --- a/docs/development/application-registry.md +++ b/docs/development/application-registry.md @@ -32,6 +32,9 @@ Core model features are listed in the [features matrix](./models.md#features-mat ### `models` +!!! warning "Deprecated" + Usage of this key has been deprecated and will be removed in NetBox v4.7. Use `ObjectType.objects.public()` to find registered models. + This key lists all models which have been registered in NetBox which are not designated for private use. (Setting `_netbox_private` to True on a model excludes it from this list.) As with individual features under `model_features`, models are organized by app label. ### `plugins` diff --git a/netbox/netbox/models/features.py b/netbox/netbox/models/features.py index e4dbf9112..993828c1b 100644 --- a/netbox/netbox/models/features.py +++ b/netbox/netbox/models/features.py @@ -723,10 +723,10 @@ def register_models(*models): for model in models: app_label, model_name = model._meta.label_lower.split('.') - # TODO: Remove in NetBox v4.5 - # Register public models + # TODO: Remove in NetBox v4.7 + # Register public models (access the underlying dict directly to avoid triggering the deprecation warning) if not getattr(model, '_netbox_private', False): - registry['models'][app_label].add(model_name) + dict.__getitem__(registry, 'models')[app_label].add(model_name) # Register applicable feature views for the model if issubclass(model, ContactsMixin): diff --git a/netbox/netbox/registry.py b/netbox/netbox/registry.py index d7e5988ce..f894a11b0 100644 --- a/netbox/netbox/registry.py +++ b/netbox/netbox/registry.py @@ -9,6 +9,15 @@ class Registry(dict): removed (though the value of each key is mutable). """ def __getitem__(self, key): + # TODO: Remove in NetBox v4.7 + if key == 'models': + import warnings + warnings.warn( + 'The "models" registry key is deprecated and will be removed in NetBox v4.7. Registered models can be ' + 'obtained by calling ObjectType.objects.public().', + DeprecationWarning, + stacklevel=2, + ) try: return super().__getitem__(key) except KeyError: @@ -30,6 +39,7 @@ registry = Registry({ 'filtersets': dict(), 'model_actions': collections.defaultdict(set), 'model_features': dict(), + # TODO: Remove in NetBox v4.7 'models': collections.defaultdict(set), 'plugins': dict(), 'request_processors': list(), From d57346d9f0eef8126eafcd5033ea43864faeaf0d Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 13 Apr 2026 14:17:05 -0400 Subject: [PATCH 076/104] Closes #21902: Upgrade django-tables2 to v3.0 --- netbox/templates/inc/table.html | 2 +- netbox/templates/inc/table_htmx.html | 4 ++-- requirements.txt | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/netbox/templates/inc/table.html b/netbox/templates/inc/table.html index 0cfa7c2b2..90de745b5 100644 --- a/netbox/templates/inc/table.html +++ b/netbox/templates/inc/table.html @@ -6,7 +6,7 @@ {% for column in table.columns %} {% if column.orderable %} - {{ column.header }} + {{ column.header }} {% else %} {{ column.header }} {% endif %} diff --git a/netbox/templates/inc/table_htmx.html b/netbox/templates/inc/table_htmx.html index 0165b1d29..bcb929656 100644 --- a/netbox/templates/inc/table_htmx.html +++ b/netbox/templates/inc/table_htmx.html @@ -13,14 +13,14 @@ {% if column.is_ordered %}
    {% endif %} {{ column.header }} {% else %} diff --git a/requirements.txt b/requirements.txt index f417292be..08ae384cf 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,7 +12,7 @@ django-redis==6.0.0 django-rich==2.2.0 django-rq==4.0.1 django-storages==1.14.6 -django-tables2==2.8.0 +django-tables2==3.0.0 django-taggit==6.1.0 django-timezone-field==7.2.1 djangorestframework==3.16.1 From ea6552b23927b401704dac1303a3821f299c43ad Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 13 Apr 2026 16:37:35 -0400 Subject: [PATCH 077/104] Revert "Closes #21902: Upgrade django-tables2 to v3.0" This reverts commit d57346d9f0eef8126eafcd5033ea43864faeaf0d. --- netbox/templates/inc/table.html | 2 +- netbox/templates/inc/table_htmx.html | 4 ++-- requirements.txt | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/netbox/templates/inc/table.html b/netbox/templates/inc/table.html index 90de745b5..0cfa7c2b2 100644 --- a/netbox/templates/inc/table.html +++ b/netbox/templates/inc/table.html @@ -6,7 +6,7 @@ {% for column in table.columns %} {% if column.orderable %} - {{ column.header }} + {{ column.header }} {% else %} {{ column.header }} {% endif %} diff --git a/netbox/templates/inc/table_htmx.html b/netbox/templates/inc/table_htmx.html index bcb929656..0165b1d29 100644 --- a/netbox/templates/inc/table_htmx.html +++ b/netbox/templates/inc/table_htmx.html @@ -13,14 +13,14 @@ {% if column.is_ordered %}
    {% endif %} {{ column.header }} {% else %} diff --git a/requirements.txt b/requirements.txt index 08ae384cf..f417292be 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,7 +12,7 @@ django-redis==6.0.0 django-rich==2.2.0 django-rq==4.0.1 django-storages==1.14.6 -django-tables2==3.0.0 +django-tables2==2.8.0 django-taggit==6.1.0 django-timezone-field==7.2.1 djangorestframework==3.16.1 From 539448683c7b3b208b96a7cd228ee9ad144faf09 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 14 Apr 2026 10:09:06 -0400 Subject: [PATCH 078/104] Release v4.6.0-beta1 (#21910) * Draft v4.6 release notes * Revert django-tables2 upgrade * Correct release notes * Release v4.6.0-beta1 * Fix typo --- base_requirements.txt | 2 +- contrib/openapi.json | 7508 +++++++++++++++++- docs/release-notes/index.md | 8 + docs/release-notes/version-4.6.md | 123 + mkdocs.yml | 1 + netbox/dcim/api/serializers_/racks.py | 3 + netbox/release.yaml | 3 +- netbox/translations/cs/LC_MESSAGES/django.mo | Bin 261900 -> 261853 bytes netbox/translations/cs/LC_MESSAGES/django.po | 149 +- netbox/translations/da/LC_MESSAGES/django.mo | Bin 253806 -> 253767 bytes netbox/translations/da/LC_MESSAGES/django.po | 149 +- netbox/translations/de/LC_MESSAGES/django.mo | Bin 267240 -> 267909 bytes netbox/translations/de/LC_MESSAGES/django.po | 150 +- netbox/translations/es/LC_MESSAGES/django.mo | Bin 269248 -> 269197 bytes netbox/translations/es/LC_MESSAGES/django.po | 149 +- netbox/translations/fr/LC_MESSAGES/django.mo | Bin 271374 -> 271328 bytes netbox/translations/fr/LC_MESSAGES/django.po | 149 +- netbox/translations/it/LC_MESSAGES/django.mo | Bin 266800 -> 266751 bytes netbox/translations/it/LC_MESSAGES/django.po | 149 +- netbox/translations/ja/LC_MESSAGES/django.mo | Bin 287619 -> 287575 bytes netbox/translations/ja/LC_MESSAGES/django.po | 149 +- netbox/translations/lv/LC_MESSAGES/django.mo | Bin 261268 -> 261921 bytes netbox/translations/lv/LC_MESSAGES/django.po | 150 +- netbox/translations/nl/LC_MESSAGES/django.mo | Bin 262500 -> 262450 bytes netbox/translations/nl/LC_MESSAGES/django.po | 149 +- netbox/translations/pl/LC_MESSAGES/django.mo | Bin 265042 -> 264996 bytes netbox/translations/pl/LC_MESSAGES/django.po | 149 +- netbox/translations/pt/LC_MESSAGES/django.mo | Bin 264799 -> 264751 bytes netbox/translations/pt/LC_MESSAGES/django.po | 149 +- netbox/translations/ru/LC_MESSAGES/django.mo | Bin 340653 -> 340597 bytes netbox/translations/ru/LC_MESSAGES/django.po | 149 +- netbox/translations/tr/LC_MESSAGES/django.mo | Bin 258156 -> 258117 bytes netbox/translations/tr/LC_MESSAGES/django.po | 149 +- netbox/translations/uk/LC_MESSAGES/django.mo | Bin 339392 -> 339336 bytes netbox/translations/uk/LC_MESSAGES/django.po | 149 +- netbox/translations/zh/LC_MESSAGES/django.mo | Bin 239269 -> 239228 bytes netbox/translations/zh/LC_MESSAGES/django.po | 149 +- pyproject.toml | 4 +- requirements.txt | 6 +- 39 files changed, 8721 insertions(+), 1174 deletions(-) create mode 100644 docs/release-notes/version-4.6.md diff --git a/base_requirements.txt b/base_requirements.txt index 0323cc784..a044746a7 100644 --- a/base_requirements.txt +++ b/base_requirements.txt @@ -71,7 +71,7 @@ django-timezone-field # A REST API framework for Django projects # https://www.django-rest-framework.org/community/release-notes/ # TODO: Re-evaluate the monkey-patch of get_unique_validators() before upgrading -djangorestframework==3.16.1 +djangorestframework==3.17.1 # Sane and flexible OpenAPI 3 schema generation for Django REST framework. # https://github.com/tfranzel/drf-spectacular/blob/master/CHANGELOG.rst diff --git a/contrib/openapi.json b/contrib/openapi.json index 4a855d5d3..dc7c75539 100644 --- a/contrib/openapi.json +++ b/contrib/openapi.json @@ -2,7 +2,7 @@ "openapi": "3.0.3", "info": { "title": "NetBox REST API", - "version": "4.5.8", + "version": "4.6.0-beta1", "license": { "name": "Apache v2 License" } @@ -733,6 +733,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -2103,6 +2112,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -3969,6 +3987,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -6007,6 +6034,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -7999,6 +8035,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "status", @@ -9930,6 +9975,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -11327,6 +11381,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -12954,6 +13017,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -14212,6 +14284,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -15774,6 +15855,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -17100,6 +17190,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "status", @@ -19067,6 +19166,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "updated_by_request", @@ -20115,6 +20223,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "status", @@ -21770,6 +21887,15 @@ "format": "date-time" } }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "started", @@ -22720,6 +22846,15 @@ "format": "uuid" } }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "time_after", @@ -23447,6 +23582,15 @@ "type": "string" }, "description": "Search" + }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } } ], "tags": [ @@ -23514,6 +23658,1209 @@ } } }, + "/api/dcim/cable-bundles/": { + "get": { + "operationId": "dcim_cable_bundles_list", + "description": "Get a list of cable bundle objects.", + "parameters": [ + { + "in": "query", + "name": "created", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "created__empty", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "created__gt", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "created__gte", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "created__lt", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "created__lte", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "created__n", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "created_by_request", + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "in": "query", + "name": "description", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "description__empty", + "schema": { + "type": "boolean" + } + }, + { + "in": "query", + "name": "description__ic", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "description__ie", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "description__iew", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "description__iregex", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "description__isw", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "description__n", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "description__nic", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "description__nie", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "description__niew", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "description__nisw", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "description__regex", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "id", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "id__empty", + "schema": { + "type": "boolean" + } + }, + { + "in": "query", + "name": "id__gt", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "id__gte", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "id__lt", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "id__lte", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "id__n", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "last_updated", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "last_updated__empty", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "last_updated__gt", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "last_updated__gte", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "last_updated__lt", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "last_updated__lte", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "last_updated__n", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "name": "limit", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "modified_by_request", + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "in": "query", + "name": "name", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "name__empty", + "schema": { + "type": "boolean" + } + }, + { + "in": "query", + "name": "name__ic", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "name__ie", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "name__iew", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "name__iregex", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "name__isw", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "name__n", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "name__nic", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "name__nie", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "name__niew", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "name__nisw", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "name__regex", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "name": "offset", + "required": false, + "in": "query", + "description": "The initial index from which to return the results.", + "schema": { + "type": "integer" + } + }, + { + "name": "ordering", + "required": false, + "in": "query", + "description": "Which field to use when ordering the results.", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "owner", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": "Owner (name)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "owner__n", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": "Owner (name)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "owner_group", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": "Owner Group (name)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "owner_group__n", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": "Owner Group (name)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "owner_group_id", + "schema": { + "type": "array", + "items": { + "type": "integer" + } + }, + "description": "Owner Group (ID)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "owner_group_id__n", + "schema": { + "type": "array", + "items": { + "type": "integer" + } + }, + "description": "Owner Group (ID)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "owner_id", + "schema": { + "type": "array", + "items": { + "type": "integer", + "nullable": true + } + }, + "description": "Owner (ID)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "owner_id__n", + "schema": { + "type": "array", + "items": { + "type": "integer", + "nullable": true + } + }, + "description": "Owner (ID)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "q", + "schema": { + "type": "string" + }, + "description": "Search" + }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "tag", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "tag__n", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "tag_id", + "schema": { + "type": "array", + "items": { + "type": "integer" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "tag_id__n", + "schema": { + "type": "array", + "items": { + "type": "integer" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "updated_by_request", + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "tags": [ + "dcim" + ], + "security": [ + { + "cookieAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedCableBundleList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "dcim_cable_bundles_create", + "description": "Post a list of cable bundle objects.", + "tags": [ + "dcim" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/CableBundleRequest" + }, + { + "type": "array", + "items": { + "$ref": "#/components/schemas/CableBundleRequest" + } + } + ] + } + }, + "multipart/form-data": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/CableBundleRequest" + }, + { + "type": "array", + "items": { + "$ref": "#/components/schemas/CableBundleRequest" + } + } + ] + } + } + }, + "required": true + }, + "security": [ + { + "cookieAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CableBundle" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "dcim_cable_bundles_bulk_update", + "description": "Put a list of cable bundle objects.", + "tags": [ + "dcim" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CableBundleRequest" + } + } + }, + "multipart/form-data": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CableBundleRequest" + } + } + } + }, + "required": true + }, + "security": [ + { + "cookieAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CableBundle" + } + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "dcim_cable_bundles_bulk_partial_update", + "description": "Patch a list of cable bundle objects.", + "tags": [ + "dcim" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CableBundleRequest" + } + } + }, + "multipart/form-data": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CableBundleRequest" + } + } + } + }, + "required": true + }, + "security": [ + { + "cookieAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CableBundle" + } + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "dcim_cable_bundles_bulk_destroy", + "description": "Delete a list of cable bundle objects.", + "tags": [ + "dcim" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CableBundleRequest" + } + } + }, + "multipart/form-data": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CableBundleRequest" + } + } + } + }, + "required": true + }, + "security": [ + { + "cookieAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/dcim/cable-bundles/{id}/": { + "get": { + "operationId": "dcim_cable_bundles_retrieve", + "description": "Get a cable bundle object.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "description": "A unique integer value identifying this cable bundle.", + "required": true + } + ], + "tags": [ + "dcim" + ], + "security": [ + { + "cookieAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CableBundle" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "dcim_cable_bundles_update", + "description": "Put a cable bundle object.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "description": "A unique integer value identifying this cable bundle.", + "required": true + } + ], + "tags": [ + "dcim" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CableBundleRequest" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/CableBundleRequest" + } + } + }, + "required": true + }, + "security": [ + { + "cookieAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CableBundle" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "dcim_cable_bundles_partial_update", + "description": "Patch a cable bundle object.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "description": "A unique integer value identifying this cable bundle.", + "required": true + } + ], + "tags": [ + "dcim" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedCableBundleRequest" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/PatchedCableBundleRequest" + } + } + } + }, + "security": [ + { + "cookieAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CableBundle" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "dcim_cable_bundles_destroy", + "description": "Delete a cable bundle object.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "description": "A unique integer value identifying this cable bundle.", + "required": true + } + ], + "tags": [ + "dcim" + ], + "security": [ + { + "cookieAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, "/api/dcim/cable-terminations/": { "get": { "operationId": "dcim_cable_terminations_list", @@ -24000,6 +25347,15 @@ "type": "string" } }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "termination_id", @@ -24188,6 +25544,60 @@ "operationId": "dcim_cables_list", "description": "Get a list of cable objects.", "parameters": [ + { + "in": "query", + "name": "bundle", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": "Cable bundle (name)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "bundle__n", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": "Cable bundle (name)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "bundle_id", + "schema": { + "type": "array", + "items": { + "type": "integer", + "nullable": true + } + }, + "description": "Cable bundle (ID)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "bundle_id__n", + "schema": { + "type": "array", + "items": { + "type": "integer", + "nullable": true + } + }, + "description": "Cable bundle (ID)", + "explode": true, + "style": "form" + }, { "in": "query", "name": "circuittermination_id", @@ -25695,6 +27105,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "status", @@ -27562,6 +28981,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "type", @@ -30089,6 +31517,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -31715,6 +33152,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "type", @@ -34242,6 +35688,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -35317,6 +36772,13 @@ "explode": true, "style": "form" }, + { + "in": "query", + "name": "enabled", + "schema": { + "type": "boolean" + } + }, { "in": "query", "name": "id", @@ -35838,6 +37300,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "updated_by_request", @@ -36829,6 +38300,13 @@ "explode": true, "style": "form" }, + { + "in": "query", + "name": "enabled", + "schema": { + "type": "boolean" + } + }, { "in": "query", "name": "id", @@ -37764,6 +39242,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -39494,6 +40981,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -42307,6 +43803,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "subdevice_role", @@ -46792,6 +48297,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "status", @@ -48889,6 +50403,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "type", @@ -51503,6 +53026,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -53680,6 +55212,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "type", @@ -57828,6 +59369,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -60224,6 +61774,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -61891,6 +63450,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "updated_by_request", @@ -64472,6 +66040,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "status", @@ -66561,6 +68138,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "status", @@ -68215,6 +69801,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -69713,6 +71308,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -70459,6 +72063,13 @@ "explode": true, "style": "form" }, + { + "in": "query", + "name": "enabled", + "schema": { + "type": "boolean" + } + }, { "in": "query", "name": "id", @@ -71159,6 +72770,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "updated_by_request", @@ -72150,6 +73770,13 @@ "explode": true, "style": "form" }, + { + "in": "query", + "name": "enabled", + "schema": { + "type": "boolean" + } + }, { "in": "query", "name": "id", @@ -73262,6 +74889,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -74560,6 +76196,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -76309,6 +77954,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -78334,6 +79988,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "status", @@ -80031,6 +81694,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -82133,6 +83805,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "status", @@ -84494,6 +86175,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "type", @@ -87233,6 +88923,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "status", @@ -89169,6 +90868,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -90634,6 +92342,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "type", @@ -93177,6 +94894,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -93971,6 +95697,1360 @@ } } }, + "/api/dcim/rack-groups/": { + "get": { + "operationId": "dcim_rack_groups_list", + "description": "Get a list of rack group objects.", + "parameters": [ + { + "in": "query", + "name": "created", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "created__empty", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "created__gt", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "created__gte", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "created__lt", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "created__lte", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "created__n", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "created_by_request", + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "in": "query", + "name": "description", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "description__empty", + "schema": { + "type": "boolean" + } + }, + { + "in": "query", + "name": "description__ic", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "description__ie", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "description__iew", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "description__iregex", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "description__isw", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "description__n", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "description__nic", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "description__nie", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "description__niew", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "description__nisw", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "description__regex", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "id", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "id__empty", + "schema": { + "type": "boolean" + } + }, + { + "in": "query", + "name": "id__gt", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "id__gte", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "id__lt", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "id__lte", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "id__n", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "last_updated", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "last_updated__empty", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "last_updated__gt", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "last_updated__gte", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "last_updated__lt", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "last_updated__lte", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "last_updated__n", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "name": "limit", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "modified_by_request", + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "in": "query", + "name": "name", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "name__empty", + "schema": { + "type": "boolean" + } + }, + { + "in": "query", + "name": "name__ic", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "name__ie", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "name__iew", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "name__iregex", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "name__isw", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "name__n", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "name__nic", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "name__nie", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "name__niew", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "name__nisw", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "name__regex", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "name": "offset", + "required": false, + "in": "query", + "description": "The initial index from which to return the results.", + "schema": { + "type": "integer" + } + }, + { + "name": "ordering", + "required": false, + "in": "query", + "description": "Which field to use when ordering the results.", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "owner", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": "Owner (name)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "owner__n", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": "Owner (name)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "owner_group", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": "Owner Group (name)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "owner_group__n", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": "Owner Group (name)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "owner_group_id", + "schema": { + "type": "array", + "items": { + "type": "integer" + } + }, + "description": "Owner Group (ID)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "owner_group_id__n", + "schema": { + "type": "array", + "items": { + "type": "integer" + } + }, + "description": "Owner Group (ID)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "owner_id", + "schema": { + "type": "array", + "items": { + "type": "integer", + "nullable": true + } + }, + "description": "Owner (ID)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "owner_id__n", + "schema": { + "type": "array", + "items": { + "type": "integer", + "nullable": true + } + }, + "description": "Owner (ID)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "q", + "schema": { + "type": "string" + }, + "description": "Search" + }, + { + "in": "query", + "name": "slug", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "slug__empty", + "schema": { + "type": "boolean" + } + }, + { + "in": "query", + "name": "slug__ic", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "slug__ie", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "slug__iew", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "slug__iregex", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "slug__isw", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "slug__n", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "slug__nic", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "slug__nie", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "slug__niew", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "slug__nisw", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "slug__regex", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "tag", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "tag__n", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "tag_id", + "schema": { + "type": "array", + "items": { + "type": "integer" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "tag_id__n", + "schema": { + "type": "array", + "items": { + "type": "integer" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "updated_by_request", + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "tags": [ + "dcim" + ], + "security": [ + { + "cookieAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedRackGroupList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "dcim_rack_groups_create", + "description": "Post a list of rack group objects.", + "tags": [ + "dcim" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/RackGroupRequest" + }, + { + "type": "array", + "items": { + "$ref": "#/components/schemas/RackGroupRequest" + } + } + ] + } + }, + "multipart/form-data": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/RackGroupRequest" + }, + { + "type": "array", + "items": { + "$ref": "#/components/schemas/RackGroupRequest" + } + } + ] + } + } + }, + "required": true + }, + "security": [ + { + "cookieAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RackGroup" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "dcim_rack_groups_bulk_update", + "description": "Put a list of rack group objects.", + "tags": [ + "dcim" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RackGroupRequest" + } + } + }, + "multipart/form-data": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RackGroupRequest" + } + } + } + }, + "required": true + }, + "security": [ + { + "cookieAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RackGroup" + } + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "dcim_rack_groups_bulk_partial_update", + "description": "Patch a list of rack group objects.", + "tags": [ + "dcim" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RackGroupRequest" + } + } + }, + "multipart/form-data": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RackGroupRequest" + } + } + } + }, + "required": true + }, + "security": [ + { + "cookieAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RackGroup" + } + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "dcim_rack_groups_bulk_destroy", + "description": "Delete a list of rack group objects.", + "tags": [ + "dcim" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RackGroupRequest" + } + } + }, + "multipart/form-data": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RackGroupRequest" + } + } + } + }, + "required": true + }, + "security": [ + { + "cookieAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/dcim/rack-groups/{id}/": { + "get": { + "operationId": "dcim_rack_groups_retrieve", + "description": "Get a rack group object.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "description": "A unique integer value identifying this rack group.", + "required": true + } + ], + "tags": [ + "dcim" + ], + "security": [ + { + "cookieAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RackGroup" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "dcim_rack_groups_update", + "description": "Put a rack group object.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "description": "A unique integer value identifying this rack group.", + "required": true + } + ], + "tags": [ + "dcim" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RackGroupRequest" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/RackGroupRequest" + } + } + }, + "required": true + }, + "security": [ + { + "cookieAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RackGroup" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "dcim_rack_groups_partial_update", + "description": "Patch a rack group object.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "description": "A unique integer value identifying this rack group.", + "required": true + } + ], + "tags": [ + "dcim" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedRackGroupRequest" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/PatchedRackGroupRequest" + } + } + } + }, + "security": [ + { + "cookieAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RackGroup" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "dcim_rack_groups_destroy", + "description": "Delete a rack group object.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "description": "A unique integer value identifying this rack group.", + "required": true + } + ], + "tags": [ + "dcim" + ], + "security": [ + { + "cookieAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, "/api/dcim/rack-reservations/": { "get": { "operationId": "dcim_rack_reservations_list", @@ -94226,6 +97306,58 @@ "explode": true, "style": "form" }, + { + "in": "query", + "name": "group", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": "Group (slug)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "group__n", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": "Group (slug)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "group_id", + "schema": { + "type": "array", + "items": { + "type": "integer" + } + }, + "description": "Group (ID)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "group_id__n", + "schema": { + "type": "array", + "items": { + "type": "integer" + } + }, + "description": "Group (ID)", + "explode": true, + "style": "form" + }, { "in": "query", "name": "id", @@ -94773,6 +97905,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "status", @@ -95135,6 +98276,22 @@ "type": "number" } }, + { + "in": "query", + "name": "unit_count_max", + "schema": { + "type": "number" + }, + "description": "Maximum unit count" + }, + { + "in": "query", + "name": "unit_count_min", + "schema": { + "type": "number" + }, + "description": "Minimum unit count" + }, { "in": "query", "name": "updated_by_request", @@ -96635,6 +99792,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -98869,6 +102035,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "starting_unit", @@ -100888,6 +104063,60 @@ "explode": true, "style": "form" }, + { + "in": "query", + "name": "group", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": "Group (slug)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "group__n", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": "Group (slug)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "group_id", + "schema": { + "type": "array", + "items": { + "type": "integer", + "nullable": true + } + }, + "description": "Group (ID)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "group_id__n", + "schema": { + "type": "array", + "items": { + "type": "integer", + "nullable": true + } + }, + "description": "Group (ID)", + "explode": true, + "style": "form" + }, { "in": "query", "name": "id", @@ -102453,6 +105682,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "starting_unit", @@ -103874,6 +107112,15 @@ }, "description": "* `json` - json\n* `svg` - svg" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "unit_height", @@ -105008,6 +108255,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "type", @@ -107622,6 +110878,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -109452,6 +112717,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -110975,6 +114249,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -112871,6 +116154,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "status", @@ -114914,6 +118206,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -116435,6 +119736,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "status", @@ -117488,6 +120798,15 @@ "type": "string" } }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "user", @@ -118826,6 +122145,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -120752,6 +124080,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -121722,6 +125059,13 @@ "explode": true, "style": "form" }, + { + "in": "query", + "name": "debug", + "schema": { + "type": "boolean" + } + }, { "in": "query", "name": "description", @@ -122802,6 +126146,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -124300,6 +127653,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "updated_by_request", @@ -126310,6 +129672,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "type", @@ -128889,6 +132260,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "updated_by_request", @@ -130716,6 +134096,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -132686,6 +136075,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "updated_by_request", @@ -134074,6 +137472,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "updated_by_request", @@ -135087,6 +138494,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -135581,6 +138997,15 @@ "schema": { "type": "string" } + }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } } ], "tags": [ @@ -136020,6 +139445,15 @@ "schema": { "type": "string" } + }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } } ], "tags": [ @@ -137492,6 +140926,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "updated_by_request", @@ -138361,6 +141804,15 @@ "type": "string" }, "description": "Search" + }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } } ], "tags": [ @@ -138666,6 +142118,15 @@ "schema": { "type": "string" } + }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } } ], "tags": [ @@ -139761,6 +143222,15 @@ "type": "boolean" } }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "table", @@ -140731,6 +144201,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -141940,6 +145419,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "updated_by_request", @@ -143806,6 +147294,15 @@ "type": "boolean" } }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -145077,6 +148574,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -146662,17 +150168,13 @@ "style": "form" }, { - "in": "query", "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" + "type": "integer" + } }, { "in": "query", @@ -148183,6 +151685,60 @@ "explode": true, "style": "form" }, + { + "in": "query", + "name": "role", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": "Role (slug)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "role__n", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": "Role (slug)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "role_id", + "schema": { + "type": "array", + "items": { + "type": "integer", + "nullable": true + } + }, + "description": "Role (ID)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "role_id__n", + "schema": { + "type": "array", + "items": { + "type": "integer", + "nullable": true + } + }, + "description": "Role (ID)", + "explode": true, + "style": "form" + }, { "in": "query", "name": "site", @@ -148283,6 +151839,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -149408,6 +152973,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "updated_by_request", @@ -151177,6 +154751,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -152986,6 +156569,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "status", @@ -154709,6 +158301,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "start_address", @@ -156901,6 +160502,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "status", @@ -158946,6 +162556,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -160291,6 +163910,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -161802,6 +165430,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -163304,6 +166941,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -164991,6 +168637,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -166245,6 +169900,13 @@ "type": "integer" } }, + { + "in": "query", + "name": "rack_group", + "schema": { + "type": "number" + } + }, { "in": "query", "name": "region", @@ -166526,6 +170188,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -166676,6 +170347,91 @@ "explode": true, "style": "form" }, + { + "in": "query", + "name": "total_vlan_ids", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "total_vlan_ids__empty", + "schema": { + "type": "boolean" + } + }, + { + "in": "query", + "name": "total_vlan_ids__gt", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "total_vlan_ids__gte", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "total_vlan_ids__lt", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "total_vlan_ids__lte", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "total_vlan_ids__n", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + }, { "in": "query", "name": "updated_by_request", @@ -167925,6 +171681,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -169084,6 +172849,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -170942,6 +174716,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "status", @@ -172767,6 +176550,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -174182,6 +177974,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -175655,6 +179456,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -177000,6 +180810,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -178846,6 +182665,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -180444,6 +184272,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -181913,6 +185750,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -182937,6 +186783,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "user_id", @@ -183796,6 +187651,15 @@ "type": "string" }, "description": "Search" + }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } } ], "tags": [ @@ -184685,6 +188549,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "user", @@ -185902,6 +189775,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "user", @@ -186952,6 +190834,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "user", @@ -188549,6 +192440,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "username", @@ -190065,6 +193965,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -191410,6 +195319,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -193039,6 +196957,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "status", @@ -195190,6 +199117,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -196645,6 +200581,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -197160,6 +201105,1663 @@ } } }, + "/api/virtualization/virtual-machine-types/": { + "get": { + "operationId": "virtualization_virtual_machine_types_list", + "description": "Get a list of virtual machine type objects.", + "parameters": [ + { + "in": "query", + "name": "created", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "created__empty", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "created__gt", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "created__gte", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "created__lt", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "created__lte", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "created__n", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "created_by_request", + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "in": "query", + "name": "default_memory", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "default_memory__empty", + "schema": { + "type": "boolean" + } + }, + { + "in": "query", + "name": "default_memory__gt", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "default_memory__gte", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "default_memory__lt", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "default_memory__lte", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "default_memory__n", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "default_platform", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "default_platform__n", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "default_platform_id", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "default_platform_id__n", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "default_vcpus", + "schema": { + "type": "array", + "items": { + "type": "number", + "format": "double" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "default_vcpus__empty", + "schema": { + "type": "boolean" + } + }, + { + "in": "query", + "name": "default_vcpus__gt", + "schema": { + "type": "array", + "items": { + "type": "number", + "format": "double" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "default_vcpus__gte", + "schema": { + "type": "array", + "items": { + "type": "number", + "format": "double" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "default_vcpus__lt", + "schema": { + "type": "array", + "items": { + "type": "number", + "format": "double" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "default_vcpus__lte", + "schema": { + "type": "array", + "items": { + "type": "number", + "format": "double" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "default_vcpus__n", + "schema": { + "type": "array", + "items": { + "type": "number", + "format": "double" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "description", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "description__empty", + "schema": { + "type": "boolean" + } + }, + { + "in": "query", + "name": "description__ic", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "description__ie", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "description__iew", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "description__iregex", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "description__isw", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "description__n", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "description__nic", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "description__nie", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "description__niew", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "description__nisw", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "description__regex", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "id", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "id__empty", + "schema": { + "type": "boolean" + } + }, + { + "in": "query", + "name": "id__gt", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "id__gte", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "id__lt", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "id__lte", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "id__n", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "last_updated", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "last_updated__empty", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "last_updated__gt", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "last_updated__gte", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "last_updated__lt", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "last_updated__lte", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "last_updated__n", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + } + }, + "explode": true, + "style": "form" + }, + { + "name": "limit", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "modified_by_request", + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "in": "query", + "name": "name", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "name__empty", + "schema": { + "type": "boolean" + } + }, + { + "in": "query", + "name": "name__ic", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "name__ie", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "name__iew", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "name__iregex", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "name__isw", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "name__n", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "name__nic", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "name__nie", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "name__niew", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "name__nisw", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "name__regex", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "name": "offset", + "required": false, + "in": "query", + "description": "The initial index from which to return the results.", + "schema": { + "type": "integer" + } + }, + { + "name": "ordering", + "required": false, + "in": "query", + "description": "Which field to use when ordering the results.", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "owner", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": "Owner (name)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "owner__n", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": "Owner (name)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "owner_group", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": "Owner Group (name)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "owner_group__n", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": "Owner Group (name)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "owner_group_id", + "schema": { + "type": "array", + "items": { + "type": "integer" + } + }, + "description": "Owner Group (ID)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "owner_group_id__n", + "schema": { + "type": "array", + "items": { + "type": "integer" + } + }, + "description": "Owner Group (ID)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "owner_id", + "schema": { + "type": "array", + "items": { + "type": "integer", + "nullable": true + } + }, + "description": "Owner (ID)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "owner_id__n", + "schema": { + "type": "array", + "items": { + "type": "integer", + "nullable": true + } + }, + "description": "Owner (ID)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "q", + "schema": { + "type": "string" + }, + "description": "Search" + }, + { + "in": "query", + "name": "slug", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "slug__empty", + "schema": { + "type": "boolean" + } + }, + { + "in": "query", + "name": "slug__ic", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "slug__ie", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "slug__iew", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "slug__iregex", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "slug__isw", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "slug__n", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "slug__nic", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "slug__nie", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "slug__niew", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "slug__nisw", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "slug__regex", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "tag", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "tag__n", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "tag_id", + "schema": { + "type": "array", + "items": { + "type": "integer" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "tag_id__n", + "schema": { + "type": "array", + "items": { + "type": "integer" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "updated_by_request", + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "in": "query", + "name": "virtual_machine_count", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "virtual_machine_count__empty", + "schema": { + "type": "boolean" + } + }, + { + "in": "query", + "name": "virtual_machine_count__gt", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "virtual_machine_count__gte", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "virtual_machine_count__lt", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "virtual_machine_count__lte", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "virtual_machine_count__n", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "explode": true, + "style": "form" + } + ], + "tags": [ + "virtualization" + ], + "security": [ + { + "cookieAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedVirtualMachineTypeList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "virtualization_virtual_machine_types_create", + "description": "Post a list of virtual machine type objects.", + "tags": [ + "virtualization" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/VirtualMachineTypeRequest" + }, + { + "type": "array", + "items": { + "$ref": "#/components/schemas/VirtualMachineTypeRequest" + } + } + ] + } + }, + "multipart/form-data": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/VirtualMachineTypeRequest" + }, + { + "type": "array", + "items": { + "$ref": "#/components/schemas/VirtualMachineTypeRequest" + } + } + ] + } + } + }, + "required": true + }, + "security": [ + { + "cookieAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VirtualMachineType" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "virtualization_virtual_machine_types_bulk_update", + "description": "Put a list of virtual machine type objects.", + "tags": [ + "virtualization" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/VirtualMachineTypeRequest" + } + } + }, + "multipart/form-data": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/VirtualMachineTypeRequest" + } + } + } + }, + "required": true + }, + "security": [ + { + "cookieAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/VirtualMachineType" + } + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "virtualization_virtual_machine_types_bulk_partial_update", + "description": "Patch a list of virtual machine type objects.", + "tags": [ + "virtualization" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/VirtualMachineTypeRequest" + } + } + }, + "multipart/form-data": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/VirtualMachineTypeRequest" + } + } + } + }, + "required": true + }, + "security": [ + { + "cookieAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/VirtualMachineType" + } + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "virtualization_virtual_machine_types_bulk_destroy", + "description": "Delete a list of virtual machine type objects.", + "tags": [ + "virtualization" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/VirtualMachineTypeRequest" + } + } + }, + "multipart/form-data": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/VirtualMachineTypeRequest" + } + } + } + }, + "required": true + }, + "security": [ + { + "cookieAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/virtualization/virtual-machine-types/{id}/": { + "get": { + "operationId": "virtualization_virtual_machine_types_retrieve", + "description": "Get a virtual machine type object.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "description": "A unique integer value identifying this virtual machine type.", + "required": true + } + ], + "tags": [ + "virtualization" + ], + "security": [ + { + "cookieAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VirtualMachineType" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "virtualization_virtual_machine_types_update", + "description": "Put a virtual machine type object.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "description": "A unique integer value identifying this virtual machine type.", + "required": true + } + ], + "tags": [ + "virtualization" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VirtualMachineTypeRequest" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/VirtualMachineTypeRequest" + } + } + }, + "required": true + }, + "security": [ + { + "cookieAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VirtualMachineType" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "virtualization_virtual_machine_types_partial_update", + "description": "Patch a virtual machine type object.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "description": "A unique integer value identifying this virtual machine type.", + "required": true + } + ], + "tags": [ + "virtualization" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedVirtualMachineTypeRequest" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/PatchedVirtualMachineTypeRequest" + } + } + } + }, + "security": [ + { + "cookieAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VirtualMachineType" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "virtualization_virtual_machine_types_destroy", + "description": "Delete a virtual machine type object.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "description": "A unique integer value identifying this virtual machine type.", + "required": true + } + ], + "tags": [ + "virtualization" + ], + "security": [ + { + "cookieAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, "/api/virtualization/virtual-machines/": { "get": { "operationId": "virtualization_virtual_machines_list", @@ -199125,6 +204727,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "start_on_boot", @@ -199778,6 +205389,62 @@ }, "explode": true, "style": "form" + }, + { + "in": "query", + "name": "virtual_machine_type", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": "Virtual machine type (slug)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "virtual_machine_type__n", + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": "Virtual machine type (slug)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "virtual_machine_type_id", + "schema": { + "type": "array", + "items": { + "type": "integer", + "nullable": true, + "title": "Type" + } + }, + "description": "Virtual machine type (ID)", + "explode": true, + "style": "form" + }, + { + "in": "query", + "name": "virtual_machine_type_id__n", + "schema": { + "type": "array", + "items": { + "type": "integer", + "nullable": true, + "title": "Type" + } + }, + "description": "Virtual machine type (ID)", + "explode": true, + "style": "form" } ], "tags": [ @@ -201295,6 +206962,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -203451,6 +209127,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -204873,6 +210558,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -206334,6 +212028,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -208124,6 +213827,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -209251,6 +214963,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -211073,6 +216794,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "status", @@ -212922,6 +218652,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -213949,6 +219688,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -215703,6 +221451,15 @@ }, "description": "Search" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "status", @@ -217496,6 +223253,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "tag", @@ -219592,6 +225358,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "status", @@ -221896,6 +227671,15 @@ "explode": true, "style": "form" }, + { + "name": "start", + "required": false, + "in": "query", + "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", + "schema": { + "type": "integer" + } + }, { "in": "query", "name": "status", @@ -222664,6 +228448,14 @@ ], "nullable": true }, + "role": { + "allOf": [ + { + "$ref": "#/components/schemas/BriefRole" + } + ], + "nullable": true + }, "tenant": { "allOf": [ { @@ -222971,6 +228763,22 @@ ], "nullable": true }, + "role": { + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/components/schemas/BriefRoleRequest" + } + ], + "nullable": true + } + ], + "nullable": true + }, "tenant": { "oneOf": [ { @@ -223716,6 +229524,57 @@ "url" ] }, + "BriefCableBundle": { + "type": "object", + "description": "Base serializer class for models inheriting from PrimaryModel.", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "url": { + "type": "string", + "format": "uri", + "readOnly": true + }, + "display": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "maxLength": 100 + }, + "description": { + "type": "string", + "maxLength": 200 + } + }, + "required": [ + "display", + "id", + "name", + "url" + ] + }, + "BriefCableBundleRequest": { + "type": "object", + "description": "Base serializer class for models inheriting from PrimaryModel.", + "properties": { + "name": { + "type": "string", + "minLength": 1, + "maxLength": 100 + }, + "description": { + "type": "string", + "maxLength": 200 + } + }, + "required": [ + "name" + ] + }, "BriefCableRequest": { "type": "object", "description": "Base serializer class for models inheriting from PrimaryModel.", @@ -224938,6 +230797,21 @@ "address": { "type": "string" }, + "nat_inside": { + "allOf": [ + { + "$ref": "#/components/schemas/NestedIPAddress" + } + ], + "nullable": true + }, + "nat_outside": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NestedIPAddress" + }, + "readOnly": true + }, "description": { "type": "string", "maxLength": 200 @@ -224948,6 +230822,7 @@ "display", "family", "id", + "nat_outside", "url" ] }, @@ -224959,6 +230834,14 @@ "type": "string", "minLength": 1 }, + "nat_inside": { + "allOf": [ + { + "$ref": "#/components/schemas/NestedIPAddressRequest" + } + ], + "nullable": true + }, "description": { "type": "string", "maxLength": 200 @@ -226548,6 +232431,76 @@ "url" ] }, + "BriefRackGroup": { + "type": "object", + "description": "Base serializer class for models inheriting from OrganizationalModel.", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "url": { + "type": "string", + "format": "uri", + "readOnly": true + }, + "display": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "maxLength": 100 + }, + "slug": { + "type": "string", + "maxLength": 100, + "pattern": "^[-a-zA-Z0-9_]+$" + }, + "description": { + "type": "string", + "maxLength": 200 + }, + "rack_count": { + "type": "integer", + "format": "int64", + "readOnly": true + } + }, + "required": [ + "display", + "id", + "name", + "rack_count", + "slug", + "url" + ] + }, + "BriefRackGroupRequest": { + "type": "object", + "description": "Base serializer class for models inheriting from OrganizationalModel.", + "properties": { + "name": { + "type": "string", + "minLength": 1, + "maxLength": 100 + }, + "slug": { + "type": "string", + "minLength": 1, + "maxLength": 100, + "pattern": "^[-a-zA-Z0-9_]+$" + }, + "description": { + "type": "string", + "maxLength": 200 + } + }, + "required": [ + "name", + "slug" + ] + }, "BriefRackRequest": { "type": "object", "description": "Base serializer class for models inheriting from PrimaryModel.", @@ -226835,9 +232788,15 @@ "type": "integer", "format": "int64", "readOnly": true + }, + "asn_count": { + "type": "integer", + "format": "int64", + "readOnly": true } }, "required": [ + "asn_count", "display", "id", "name", @@ -227888,6 +233847,70 @@ "name" ] }, + "BriefVirtualMachineType": { + "type": "object", + "description": "Base serializer class for models inheriting from PrimaryModel.", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "url": { + "type": "string", + "format": "uri", + "readOnly": true + }, + "display": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "maxLength": 100 + }, + "slug": { + "type": "string", + "maxLength": 100, + "pattern": "^[-a-zA-Z0-9_]+$" + }, + "description": { + "type": "string", + "maxLength": 200 + } + }, + "required": [ + "display", + "id", + "name", + "slug", + "url" + ] + }, + "BriefVirtualMachineTypeRequest": { + "type": "object", + "description": "Base serializer class for models inheriting from PrimaryModel.", + "properties": { + "name": { + "type": "string", + "minLength": 1, + "maxLength": 100 + }, + "slug": { + "type": "string", + "minLength": 1, + "maxLength": 100, + "pattern": "^[-a-zA-Z0-9_]+$" + }, + "description": { + "type": "string", + "maxLength": 200 + } + }, + "required": [ + "name", + "slug" + ] + }, "BriefWirelessLANGroup": { "type": "object", "description": "Base serializer class for models inheriting from NestedGroupModel.", @@ -228139,6 +234162,14 @@ ], "nullable": true }, + "bundle": { + "allOf": [ + { + "$ref": "#/components/schemas/BriefCableBundle" + } + ], + "nullable": true + }, "label": { "type": "string", "maxLength": 100 @@ -228236,6 +234267,133 @@ "url" ] }, + "CableBundle": { + "type": "object", + "description": "Base serializer class for models inheriting from PrimaryModel.", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "url": { + "type": "string", + "format": "uri", + "readOnly": true + }, + "display_url": { + "type": "string", + "format": "uri", + "readOnly": true + }, + "display": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "maxLength": 100 + }, + "description": { + "type": "string", + "maxLength": 200 + }, + "owner": { + "allOf": [ + { + "$ref": "#/components/schemas/BriefOwner" + } + ], + "nullable": true + }, + "comments": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NestedTag" + } + }, + "custom_fields": { + "type": "object", + "additionalProperties": {} + }, + "created": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + }, + "last_updated": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + }, + "cable_count": { + "type": "integer", + "readOnly": true, + "default": 0 + } + }, + "required": [ + "cable_count", + "created", + "display", + "display_url", + "id", + "last_updated", + "name", + "url" + ] + }, + "CableBundleRequest": { + "type": "object", + "description": "Base serializer class for models inheriting from PrimaryModel.", + "properties": { + "name": { + "type": "string", + "minLength": 1, + "maxLength": 100 + }, + "description": { + "type": "string", + "maxLength": 200 + }, + "owner": { + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/components/schemas/BriefOwnerRequest" + } + ], + "nullable": true + } + ], + "nullable": true + }, + "comments": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NestedTagRequest" + } + }, + "custom_fields": { + "type": "object", + "additionalProperties": {} + } + }, + "required": [ + "name" + ] + }, "CableRequest": { "type": "object", "description": "Base serializer class for models inheriting from PrimaryModel.", @@ -228353,6 +234511,22 @@ ], "nullable": true }, + "bundle": { + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/components/schemas/BriefCableBundleRequest" + } + ], + "nullable": true + } + ], + "nullable": true + }, "label": { "type": "string", "maxLength": 100 @@ -230780,6 +236954,10 @@ "type": "boolean", "description": "Download file as attachment" }, + "debug": { + "type": "boolean", + "description": "Enable verbose error output when rendering this template. Not recommended for production use." + }, "data_source": { "$ref": "#/components/schemas/BriefDataSource" }, @@ -230884,6 +237062,10 @@ "type": "boolean", "description": "Download file as attachment" }, + "debug": { + "type": "boolean", + "description": "Enable verbose error output when rendering this template. Not recommended for production use." + }, "data_source": { "oneOf": [ { @@ -232884,6 +239066,10 @@ "description": "Regular expression to enforce on text field values. Use ^ and $ to force matching of entire string. For example, ^[A-Z]{3}$ will limit values to exactly three uppercase letters.", "maxLength": 500 }, + "validation_schema": { + "nullable": true, + "description": "A JSON schema definition for validating the custom field value" + }, "choice_set": { "allOf": [ { @@ -233236,6 +239422,10 @@ "description": "Regular expression to enforce on text field values. Use ^ and $ to force matching of entire string. For example, ^[A-Z]{3}$ will limit values to exactly three uppercase letters.", "maxLength": 500 }, + "validation_schema": { + "nullable": true, + "description": "A JSON schema definition for validating the custom field value" + }, "choice_set": { "oneOf": [ { @@ -234224,6 +240414,9 @@ "description": "Physical label", "maxLength": 64 }, + "enabled": { + "type": "boolean" + }, "description": { "type": "string", "maxLength": 200 @@ -234265,9 +240458,15 @@ "format": "date-time", "readOnly": true, "nullable": true + }, + "_occupied": { + "type": "boolean", + "readOnly": true, + "title": " occupied" } }, "required": [ + "_occupied", "created", "device", "display", @@ -234302,6 +240501,9 @@ "description": "Physical label", "maxLength": 64 }, + "enabled": { + "type": "boolean" + }, "description": { "type": "string", "maxLength": 200 @@ -234384,6 +240586,9 @@ "description": "Physical label", "maxLength": 64 }, + "enabled": { + "type": "boolean" + }, "description": { "type": "string", "maxLength": 200 @@ -234436,6 +240641,9 @@ "description": "Physical label", "maxLength": 64 }, + "enabled": { + "type": "boolean" + }, "description": { "type": "string", "maxLength": 200 @@ -244641,14 +250849,6 @@ "type": "string", "maxLength": 64 }, - "installed_module": { - "allOf": [ - { - "$ref": "#/components/schemas/BriefModule" - } - ], - "nullable": true - }, "label": { "type": "string", "description": "Physical label", @@ -244659,10 +250859,21 @@ "description": "Identifier to reference when renaming installed components", "maxLength": 30 }, + "enabled": { + "type": "boolean" + }, "description": { "type": "string", "maxLength": 200 }, + "installed_module": { + "allOf": [ + { + "$ref": "#/components/schemas/BriefModule" + } + ], + "nullable": true + }, "owner": { "allOf": [ { @@ -244692,9 +250903,15 @@ "format": "date-time", "readOnly": true, "nullable": true + }, + "_occupied": { + "type": "boolean", + "readOnly": true, + "title": " occupied" } }, "required": [ + "_occupied", "created", "device", "display", @@ -244740,6 +250957,23 @@ "minLength": 1, "maxLength": 64 }, + "label": { + "type": "string", + "description": "Physical label", + "maxLength": 64 + }, + "position": { + "type": "string", + "description": "Identifier to reference when renaming installed components", + "maxLength": 30 + }, + "enabled": { + "type": "boolean" + }, + "description": { + "type": "string", + "maxLength": 200 + }, "installed_module": { "oneOf": [ { @@ -244756,20 +250990,6 @@ ], "nullable": true }, - "label": { - "type": "string", - "description": "Physical label", - "maxLength": 64 - }, - "position": { - "type": "string", - "description": "Identifier to reference when renaming installed components", - "maxLength": 30 - }, - "description": { - "type": "string", - "maxLength": 200 - }, "owner": { "oneOf": [ { @@ -244850,6 +251070,9 @@ "description": "Identifier to reference when renaming installed components", "maxLength": 30 }, + "enabled": { + "type": "boolean" + }, "description": { "type": "string", "maxLength": 200 @@ -244928,6 +251151,9 @@ "description": "Identifier to reference when renaming installed components", "maxLength": 30 }, + "enabled": { + "type": "boolean" + }, "description": { "type": "string", "maxLength": 200 @@ -245020,6 +251246,18 @@ "custom_fields": { "type": "object", "additionalProperties": {} + }, + "replicate_components": { + "type": "boolean", + "writeOnly": true, + "default": true, + "description": "Automatically populate components associated with this module type (default: true)" + }, + "adopt_components": { + "type": "boolean", + "writeOnly": true, + "default": false, + "description": "Adopt already existing components" } }, "required": [ @@ -247437,6 +253675,37 @@ } } }, + "PaginatedCableBundleList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?offset=400&limit=100" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?offset=200&limit=100" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CableBundle" + } + } + } + }, "PaginatedCableList": { "type": "object", "required": [ @@ -249979,6 +256248,37 @@ } } }, + "PaginatedRackGroupList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?offset=400&limit=100" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?offset=200&limit=100" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RackGroup" + } + } + } + }, "PaginatedRackList": { "type": "object", "required": [ @@ -251188,6 +257488,37 @@ } } }, + "PaginatedVirtualMachineTypeList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?offset=400&limit=100" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?offset=200&limit=100" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/VirtualMachineType" + } + } + } + }, "PaginatedVirtualMachineWithConfigContextList": { "type": "object", "required": [ @@ -251458,6 +257789,22 @@ ], "nullable": true }, + "role": { + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/components/schemas/BriefRoleRequest" + } + ], + "nullable": true + } + ], + "nullable": true + }, "tenant": { "oneOf": [ { @@ -251540,6 +257887,50 @@ } } }, + "PatchedCableBundleRequest": { + "type": "object", + "description": "Base serializer class for models inheriting from PrimaryModel.", + "properties": { + "name": { + "type": "string", + "minLength": 1, + "maxLength": 100 + }, + "description": { + "type": "string", + "maxLength": 200 + }, + "owner": { + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/components/schemas/BriefOwnerRequest" + } + ], + "nullable": true + } + ], + "nullable": true + }, + "comments": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NestedTagRequest" + } + }, + "custom_fields": { + "type": "object", + "additionalProperties": {} + } + } + }, "PatchedCircuitGroupRequest": { "type": "object", "description": "Base serializer class for models inheriting from OrganizationalModel.", @@ -252082,6 +258473,10 @@ "type": "boolean", "description": "Download file as attachment" }, + "debug": { + "type": "boolean", + "description": "Enable verbose error output when rendering this template. Not recommended for production use." + }, "data_source": { "oneOf": [ { @@ -252355,6 +258750,9 @@ "description": "Physical label", "maxLength": 64 }, + "enabled": { + "type": "boolean" + }, "description": { "type": "string", "maxLength": 200 @@ -252428,6 +258826,9 @@ "description": "Physical label", "maxLength": 64 }, + "enabled": { + "type": "boolean" + }, "description": { "type": "string", "maxLength": 200 @@ -252981,6 +259382,23 @@ "minLength": 1, "maxLength": 64 }, + "label": { + "type": "string", + "description": "Physical label", + "maxLength": 64 + }, + "position": { + "type": "string", + "description": "Identifier to reference when renaming installed components", + "maxLength": 30 + }, + "enabled": { + "type": "boolean" + }, + "description": { + "type": "string", + "maxLength": 200 + }, "installed_module": { "oneOf": [ { @@ -252997,20 +259415,6 @@ ], "nullable": true }, - "label": { - "type": "string", - "description": "Physical label", - "maxLength": 64 - }, - "position": { - "type": "string", - "description": "Identifier to reference when renaming installed components", - "maxLength": 30 - }, - "description": { - "type": "string", - "maxLength": 200 - }, "owner": { "oneOf": [ { @@ -253091,6 +259495,9 @@ "description": "Identifier to reference when renaming installed components", "maxLength": 30 }, + "enabled": { + "type": "boolean" + }, "description": { "type": "string", "maxLength": 200 @@ -253629,6 +260036,56 @@ } } }, + "PatchedRackGroupRequest": { + "type": "object", + "description": "Base serializer class for models inheriting from OrganizationalModel.", + "properties": { + "name": { + "type": "string", + "minLength": 1, + "maxLength": 100 + }, + "slug": { + "type": "string", + "minLength": 1, + "maxLength": 100, + "pattern": "^[-a-zA-Z0-9_]+$" + }, + "description": { + "type": "string", + "maxLength": 200 + }, + "owner": { + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/components/schemas/BriefOwnerRequest" + } + ], + "nullable": true + } + ], + "nullable": true + }, + "comments": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NestedTagRequest" + } + }, + "custom_fields": { + "type": "object", + "additionalProperties": {} + } + } + }, "PatchedRackRoleRequest": { "type": "object", "description": "Base serializer class for models inheriting from OrganizationalModel.", @@ -254567,6 +261024,87 @@ } } }, + "PatchedVirtualMachineTypeRequest": { + "type": "object", + "description": "Base serializer class for models inheriting from PrimaryModel.", + "properties": { + "name": { + "type": "string", + "minLength": 1, + "maxLength": 100 + }, + "slug": { + "type": "string", + "minLength": 1, + "maxLength": 100, + "pattern": "^[-a-zA-Z0-9_]+$" + }, + "default_platform": { + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/components/schemas/BriefPlatformRequest" + } + ], + "nullable": true + } + ], + "nullable": true + }, + "default_vcpus": { + "type": "number", + "format": "double", + "maximum": 10000, + "minimum": 0.01, + "exclusiveMaximum": true, + "nullable": true + }, + "default_memory": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0, + "nullable": true, + "title": "Default memory (MB)" + }, + "description": { + "type": "string", + "maxLength": 200 + }, + "owner": { + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/components/schemas/BriefOwnerRequest" + } + ], + "nullable": true + } + ], + "nullable": true + }, + "comments": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NestedTagRequest" + } + }, + "custom_fields": { + "type": "object", + "additionalProperties": {} + } + } + }, "PatchedWebhookRequest": { "type": "object", "description": "Adds an `owner` field for models which have a ForeignKey to users.Owner.", @@ -254848,6 +261386,22 @@ ], "nullable": true }, + "bundle": { + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/components/schemas/BriefCableBundleRequest" + } + ], + "nullable": true + } + ], + "nullable": true + }, "label": { "type": "string", "maxLength": 100 @@ -255946,6 +262500,10 @@ "description": "Regular expression to enforce on text field values. Use ^ and $ to force matching of entire string. For example, ^[A-Z]{3}$ will limit values to exactly three uppercase letters.", "maxLength": 500 }, + "validation_schema": { + "nullable": true, + "description": "A JSON schema definition for validating the custom field value" + }, "choice_set": { "oneOf": [ { @@ -259269,6 +265827,18 @@ "custom_fields": { "type": "object", "additionalProperties": {} + }, + "replicate_components": { + "type": "boolean", + "writeOnly": true, + "default": true, + "description": "Automatically populate components associated with this module type (default: true)" + }, + "adopt_components": { + "type": "boolean", + "writeOnly": true, + "default": false, + "description": "Adopt already existing components" } } }, @@ -260610,6 +267180,22 @@ ], "nullable": true }, + "group": { + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/components/schemas/BriefRackGroupRequest" + } + ], + "nullable": true + } + ], + "nullable": true + }, "tenant": { "oneOf": [ { @@ -262700,6 +269286,38 @@ "minLength": 1, "maxLength": 64 }, + "virtual_machine_type": { + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/components/schemas/BriefVirtualMachineTypeRequest" + } + ], + "nullable": true + } + ], + "nullable": true + }, + "role": { + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/components/schemas/BriefDeviceRoleRequest" + } + ], + "nullable": true + } + ], + "nullable": true + }, "status": { "enum": [ "offline", @@ -262772,43 +269390,6 @@ ], "nullable": true }, - "serial": { - "type": "string", - "title": "Serial number", - "maxLength": 50 - }, - "role": { - "oneOf": [ - { - "type": "integer" - }, - { - "allOf": [ - { - "$ref": "#/components/schemas/BriefDeviceRoleRequest" - } - ], - "nullable": true - } - ], - "nullable": true - }, - "tenant": { - "oneOf": [ - { - "type": "integer" - }, - { - "allOf": [ - { - "$ref": "#/components/schemas/BriefTenantRequest" - } - ], - "nullable": true - } - ], - "nullable": true - }, "platform": { "oneOf": [ { @@ -262881,6 +269462,27 @@ "type": "string", "maxLength": 200 }, + "serial": { + "type": "string", + "title": "Serial number", + "maxLength": 50 + }, + "tenant": { + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/components/schemas/BriefTenantRequest" + } + ], + "nullable": true + } + ], + "nullable": true + }, "owner": { "oneOf": [ { @@ -262900,6 +269502,16 @@ "comments": { "type": "string" }, + "tags": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NestedTagRequest" + } + }, + "local_context_data": { + "nullable": true, + "description": "Local config context data takes precedence over source contexts in the final rendered config context" + }, "config_template": { "oneOf": [ { @@ -262916,16 +269528,6 @@ ], "nullable": true }, - "local_context_data": { - "nullable": true, - "description": "Local config context data takes precedence over source contexts in the final rendered config context" - }, - "tags": { - "type": "array", - "items": { - "$ref": "#/components/schemas/NestedTagRequest" - } - }, "custom_fields": { "type": "object", "additionalProperties": {} @@ -267324,6 +273926,14 @@ ], "nullable": true }, + "group": { + "allOf": [ + { + "$ref": "#/components/schemas/BriefRackGroup" + } + ], + "nullable": true + }, "tenant": { "allOf": [ { @@ -267642,6 +274252,146 @@ "url" ] }, + "RackGroup": { + "type": "object", + "description": "Base serializer class for models inheriting from OrganizationalModel.", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "url": { + "type": "string", + "format": "uri", + "readOnly": true + }, + "display_url": { + "type": "string", + "format": "uri", + "readOnly": true + }, + "display": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "maxLength": 100 + }, + "slug": { + "type": "string", + "maxLength": 100, + "pattern": "^[-a-zA-Z0-9_]+$" + }, + "description": { + "type": "string", + "maxLength": 200 + }, + "owner": { + "allOf": [ + { + "$ref": "#/components/schemas/BriefOwner" + } + ], + "nullable": true + }, + "comments": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NestedTag" + } + }, + "custom_fields": { + "type": "object", + "additionalProperties": {} + }, + "created": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + }, + "last_updated": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + }, + "rack_count": { + "type": "integer", + "format": "int64", + "readOnly": true + } + }, + "required": [ + "created", + "display", + "display_url", + "id", + "last_updated", + "name", + "rack_count", + "slug", + "url" + ] + }, + "RackGroupRequest": { + "type": "object", + "description": "Base serializer class for models inheriting from OrganizationalModel.", + "properties": { + "name": { + "type": "string", + "minLength": 1, + "maxLength": 100 + }, + "slug": { + "type": "string", + "minLength": 1, + "maxLength": 100, + "pattern": "^[-a-zA-Z0-9_]+$" + }, + "description": { + "type": "string", + "maxLength": 200 + }, + "owner": { + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/components/schemas/BriefOwnerRequest" + } + ], + "nullable": true + } + ], + "nullable": true + }, + "comments": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NestedTagRequest" + } + }, + "custom_fields": { + "type": "object", + "additionalProperties": {} + } + }, + "required": [ + "name", + "slug" + ] + }, "RackRequest": { "type": "object", "description": "Base serializer class for models inheriting from PrimaryModel.", @@ -267682,6 +274432,22 @@ ], "nullable": true }, + "group": { + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/components/schemas/BriefRackGroupRequest" + } + ], + "nullable": true + } + ], + "nullable": true + }, "tenant": { "oneOf": [ { @@ -267951,6 +274717,11 @@ "minimum": 0 } }, + "unit_count": { + "type": "integer", + "format": "int32", + "readOnly": true + }, "status": { "type": "object", "properties": { @@ -268031,6 +274802,7 @@ "id", "last_updated", "rack", + "unit_count", "units", "url", "user" @@ -269924,9 +276696,15 @@ "type": "integer", "format": "int64", "readOnly": true + }, + "asn_count": { + "type": "integer", + "format": "int64", + "readOnly": true } }, "required": [ + "asn_count", "created", "display", "display_url", @@ -273419,6 +280197,10 @@ "$ref": "#/components/schemas/IntegerRange" } }, + "total_vlan_ids": { + "type": "integer", + "readOnly": true + }, "tenant": { "allOf": [ { @@ -273483,6 +280265,7 @@ "name", "scope", "slug", + "total_vlan_ids", "url", "utilization", "vlan_count" @@ -275588,6 +282371,199 @@ "virtual_machine" ] }, + "VirtualMachineType": { + "type": "object", + "description": "Base serializer class for models inheriting from PrimaryModel.", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "url": { + "type": "string", + "format": "uri", + "readOnly": true + }, + "display_url": { + "type": "string", + "format": "uri", + "readOnly": true + }, + "display": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "maxLength": 100 + }, + "slug": { + "type": "string", + "maxLength": 100, + "pattern": "^[-a-zA-Z0-9_]+$" + }, + "default_platform": { + "allOf": [ + { + "$ref": "#/components/schemas/BriefPlatform" + } + ], + "nullable": true + }, + "default_vcpus": { + "type": "number", + "format": "double", + "maximum": 10000, + "minimum": 0.01, + "exclusiveMaximum": true, + "nullable": true + }, + "default_memory": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0, + "nullable": true, + "title": "Default memory (MB)" + }, + "description": { + "type": "string", + "maxLength": 200 + }, + "owner": { + "allOf": [ + { + "$ref": "#/components/schemas/BriefOwner" + } + ], + "nullable": true + }, + "comments": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NestedTag" + } + }, + "custom_fields": { + "type": "object", + "additionalProperties": {} + }, + "created": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + }, + "last_updated": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + }, + "virtual_machine_count": { + "type": "integer", + "readOnly": true + } + }, + "required": [ + "created", + "display", + "display_url", + "id", + "last_updated", + "name", + "slug", + "url", + "virtual_machine_count" + ] + }, + "VirtualMachineTypeRequest": { + "type": "object", + "description": "Base serializer class for models inheriting from PrimaryModel.", + "properties": { + "name": { + "type": "string", + "minLength": 1, + "maxLength": 100 + }, + "slug": { + "type": "string", + "minLength": 1, + "maxLength": 100, + "pattern": "^[-a-zA-Z0-9_]+$" + }, + "default_platform": { + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/components/schemas/BriefPlatformRequest" + } + ], + "nullable": true + } + ], + "nullable": true + }, + "default_vcpus": { + "type": "number", + "format": "double", + "maximum": 10000, + "minimum": 0.01, + "exclusiveMaximum": true, + "nullable": true + }, + "default_memory": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0, + "nullable": true, + "title": "Default memory (MB)" + }, + "description": { + "type": "string", + "maxLength": 200 + }, + "owner": { + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/components/schemas/BriefOwnerRequest" + } + ], + "nullable": true + } + ], + "nullable": true + }, + "comments": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NestedTagRequest" + } + }, + "custom_fields": { + "type": "object", + "additionalProperties": {} + } + }, + "required": [ + "name", + "slug" + ] + }, "VirtualMachineWithConfigContext": { "type": "object", "description": "Base serializer class for models inheriting from PrimaryModel.", @@ -275614,6 +282590,22 @@ "type": "string", "maxLength": 64 }, + "virtual_machine_type": { + "allOf": [ + { + "$ref": "#/components/schemas/BriefVirtualMachineType" + } + ], + "nullable": true + }, + "role": { + "allOf": [ + { + "$ref": "#/components/schemas/BriefDeviceRole" + } + ], + "nullable": true + }, "status": { "type": "object", "properties": { @@ -275692,27 +282684,6 @@ ], "nullable": true }, - "serial": { - "type": "string", - "title": "Serial number", - "maxLength": 50 - }, - "role": { - "allOf": [ - { - "$ref": "#/components/schemas/BriefDeviceRole" - } - ], - "nullable": true - }, - "tenant": { - "allOf": [ - { - "$ref": "#/components/schemas/BriefTenant" - } - ], - "nullable": true - }, "platform": { "allOf": [ { @@ -275770,6 +282741,19 @@ "type": "string", "maxLength": 200 }, + "serial": { + "type": "string", + "title": "Serial number", + "maxLength": 50 + }, + "tenant": { + "allOf": [ + { + "$ref": "#/components/schemas/BriefTenant" + } + ], + "nullable": true + }, "owner": { "allOf": [ { @@ -275781,6 +282765,16 @@ "comments": { "type": "string" }, + "tags": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NestedTag" + } + }, + "local_context_data": { + "nullable": true, + "description": "Local config context data takes precedence over source contexts in the final rendered config context" + }, "config_template": { "allOf": [ { @@ -275789,24 +282783,10 @@ ], "nullable": true }, - "local_context_data": { - "nullable": true, - "description": "Local config context data takes precedence over source contexts in the final rendered config context" - }, - "tags": { - "type": "array", - "items": { - "$ref": "#/components/schemas/NestedTag" - } - }, "custom_fields": { "type": "object", "additionalProperties": {} }, - "config_context": { - "nullable": true, - "readOnly": true - }, "created": { "type": "string", "format": "date-time", @@ -275826,6 +282806,10 @@ "virtual_disk_count": { "type": "integer", "readOnly": true + }, + "config_context": { + "nullable": true, + "readOnly": true } }, "required": [ @@ -275851,6 +282835,38 @@ "minLength": 1, "maxLength": 64 }, + "virtual_machine_type": { + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/components/schemas/BriefVirtualMachineTypeRequest" + } + ], + "nullable": true + } + ], + "nullable": true + }, + "role": { + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/components/schemas/BriefDeviceRoleRequest" + } + ], + "nullable": true + } + ], + "nullable": true + }, "status": { "enum": [ "offline", @@ -275923,43 +282939,6 @@ ], "nullable": true }, - "serial": { - "type": "string", - "title": "Serial number", - "maxLength": 50 - }, - "role": { - "oneOf": [ - { - "type": "integer" - }, - { - "allOf": [ - { - "$ref": "#/components/schemas/BriefDeviceRoleRequest" - } - ], - "nullable": true - } - ], - "nullable": true - }, - "tenant": { - "oneOf": [ - { - "type": "integer" - }, - { - "allOf": [ - { - "$ref": "#/components/schemas/BriefTenantRequest" - } - ], - "nullable": true - } - ], - "nullable": true - }, "platform": { "oneOf": [ { @@ -276032,6 +283011,27 @@ "type": "string", "maxLength": 200 }, + "serial": { + "type": "string", + "title": "Serial number", + "maxLength": 50 + }, + "tenant": { + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/components/schemas/BriefTenantRequest" + } + ], + "nullable": true + } + ], + "nullable": true + }, "owner": { "oneOf": [ { @@ -276051,6 +283051,16 @@ "comments": { "type": "string" }, + "tags": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NestedTagRequest" + } + }, + "local_context_data": { + "nullable": true, + "description": "Local config context data takes precedence over source contexts in the final rendered config context" + }, "config_template": { "oneOf": [ { @@ -276067,16 +283077,6 @@ ], "nullable": true }, - "local_context_data": { - "nullable": true, - "description": "Local config context data takes precedence over source contexts in the final rendered config context" - }, - "tags": { - "type": "array", - "items": { - "$ref": "#/components/schemas/NestedTagRequest" - } - }, "custom_fields": { "type": "object", "additionalProperties": {} @@ -277338,6 +284338,22 @@ ], "nullable": true }, + "bundle": { + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/components/schemas/BriefCableBundleRequest" + } + ], + "nullable": true + } + ], + "nullable": true + }, "label": { "type": "string", "maxLength": 100 @@ -278477,6 +285493,10 @@ "description": "Regular expression to enforce on text field values. Use ^ and $ to force matching of entire string. For example, ^[A-Z]{3}$ will limit values to exactly three uppercase letters.", "maxLength": 500 }, + "validation_schema": { + "nullable": true, + "description": "A JSON schema definition for validating the custom field value" + }, "choice_set": { "oneOf": [ { @@ -281894,6 +288914,18 @@ "custom_fields": { "type": "object", "additionalProperties": {} + }, + "replicate_components": { + "type": "boolean", + "writeOnly": true, + "default": true, + "description": "Automatically populate components associated with this module type (default: true)" + }, + "adopt_components": { + "type": "boolean", + "writeOnly": true, + "default": false, + "description": "Adopt already existing components" } }, "required": [ @@ -283269,6 +290301,22 @@ ], "nullable": true }, + "group": { + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/components/schemas/BriefRackGroupRequest" + } + ], + "nullable": true + } + ], + "nullable": true + }, "tenant": { "oneOf": [ { @@ -285445,6 +292493,38 @@ "minLength": 1, "maxLength": 64 }, + "virtual_machine_type": { + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/components/schemas/BriefVirtualMachineTypeRequest" + } + ], + "nullable": true + } + ], + "nullable": true + }, + "role": { + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/components/schemas/BriefDeviceRoleRequest" + } + ], + "nullable": true + } + ], + "nullable": true + }, "status": { "enum": [ "offline", @@ -285517,43 +292597,6 @@ ], "nullable": true }, - "serial": { - "type": "string", - "title": "Serial number", - "maxLength": 50 - }, - "role": { - "oneOf": [ - { - "type": "integer" - }, - { - "allOf": [ - { - "$ref": "#/components/schemas/BriefDeviceRoleRequest" - } - ], - "nullable": true - } - ], - "nullable": true - }, - "tenant": { - "oneOf": [ - { - "type": "integer" - }, - { - "allOf": [ - { - "$ref": "#/components/schemas/BriefTenantRequest" - } - ], - "nullable": true - } - ], - "nullable": true - }, "platform": { "oneOf": [ { @@ -285626,6 +292669,27 @@ "type": "string", "maxLength": 200 }, + "serial": { + "type": "string", + "title": "Serial number", + "maxLength": 50 + }, + "tenant": { + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/components/schemas/BriefTenantRequest" + } + ], + "nullable": true + } + ], + "nullable": true + }, "owner": { "oneOf": [ { @@ -285645,6 +292709,16 @@ "comments": { "type": "string" }, + "tags": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NestedTagRequest" + } + }, + "local_context_data": { + "nullable": true, + "description": "Local config context data takes precedence over source contexts in the final rendered config context" + }, "config_template": { "oneOf": [ { @@ -285661,16 +292735,6 @@ ], "nullable": true }, - "local_context_data": { - "nullable": true, - "description": "Local config context data takes precedence over source contexts in the final rendered config context" - }, - "tags": { - "type": "array", - "items": { - "$ref": "#/components/schemas/NestedTagRequest" - } - }, "custom_fields": { "type": "object", "additionalProperties": {} diff --git a/docs/release-notes/index.md b/docs/release-notes/index.md index 27cea90f3..ac339b2b4 100644 --- a/docs/release-notes/index.md +++ b/docs/release-notes/index.md @@ -10,6 +10,14 @@ Minor releases are published in April, August, and December of each calendar yea This page contains a history of all major and minor releases since NetBox v2.0. For more detail on a specific patch release, please see the release notes page for that specific minor release. +#### [Version 4.6](./version-4.6.md) (May 2026) + +* Virtual Machine Types ([#5795](https://github.com/netbox-community/netbox/issues/5795)) +* Cable Bundles ([#20151](https://github.com/netbox-community/netbox/issues/20151)) +* Rack Groups ([#20961](https://github.com/netbox-community/netbox/issues/20961)) +* ETag Support for REST API ([#21356](https://github.com/netbox-community/netbox/issues/21356)) +* Cursor-based Pagination for REST API ([#21363](https://github.com/netbox-community/netbox/issues/21363)) + #### [Version 4.5](./version-4.5.md) (January 2026) * Lookup Modifiers in Filter Forms ([#7604](https://github.com/netbox-community/netbox/issues/7604)) diff --git a/docs/release-notes/version-4.6.md b/docs/release-notes/version-4.6.md new file mode 100644 index 000000000..19df0b4d6 --- /dev/null +++ b/docs/release-notes/version-4.6.md @@ -0,0 +1,123 @@ +# NetBox v4.6 + +## v4.6.0-beta1 (2026-04-14) + +### New Features + +#### Virtual Machine Types ([#5795](https://github.com/netbox-community/netbox/issues/5795)) + +A new VirtualMachineType model has been introduced to enable categorization of virtual machines by instance type, analogous to how DeviceType categorizes physical hardware. VM types can be defined once and reused across many virtual machines. + +#### Cable Bundles ([#20151](https://github.com/netbox-community/netbox/issues/20151)) + +A new CableBundle model allows individual cables to be grouped together to represent physical cable runs that are managed as a unit; e.g. a bundle of 48 CAT6 cables between two patch panels. (Please note that this feature is _not_ suitable for modeling individual fiber strands within a single cable.) + +#### Rack Groups ([#20961](https://github.com/netbox-community/netbox/issues/20961)) + +A flat RackGroup model has been reintroduced to provide a lightweight secondary axis of rack organization (e.g. by row or aisle) that is independent of the location hierarchy. Racks carry an optional foreign key to a RackGroup, and RackGroup can also serve as a scope for VLANGroup assignments. + +#### ETag Support for REST API ([#21356](https://github.com/netbox-community/netbox/issues/21356)) + +The REST API now returns an `ETag` header on responses for individual objects, derived from the object's last-updated timestamp. Clients can supply an `If-Match` header on PUT/PATCH requests to guard against conflicting concurrent updates; if the object has been modified since the ETag was issued, the server returns a 412 (Precondition Failed) response. + +#### Cursor-based Pagination for REST API ([#21363](https://github.com/netbox-community/netbox/issues/21363)) + +A new `start` query parameter has been introduced as an efficient alternative to the existing `offset` parameter for paginating large result sets. Rather than scanning the table up to a relative offset, the `start` parameter filters for objects with a primary key equal to or greater than the given value, enabling constant-time pagination regardless of result set size. + +### Enhancements + +* [#12024](https://github.com/netbox-community/netbox/issues/12024) - Permit virtual machines to be assigned to devices without a cluster +* [#14329](https://github.com/netbox-community/netbox/issues/14329) - Improve diff highlighting for custom field data in change logs +* [#15513](https://github.com/netbox-community/netbox/issues/15513) - Add bulk creation support for IP prefixes +* [#17654](https://github.com/netbox-community/netbox/issues/17654) - Support role assignment for ASNs +* [#19025](https://github.com/netbox-community/netbox/issues/19025) - Support optional schema validation for JSON custom fields +* [#19034](https://github.com/netbox-community/netbox/issues/19034) - Annotate total reserved unit count on rack reservations +* [#19138](https://github.com/netbox-community/netbox/issues/19138) - Include NAT addresses for primary & out-of-band IP addresses in REST API +* [#19796](https://github.com/netbox-community/netbox/issues/19796) - Support `{module}` position inheritance for nested module bays +* [#19953](https://github.com/netbox-community/netbox/issues/19953) - Enable debugging support for ConfigTemplate rendering +* [#20123](https://github.com/netbox-community/netbox/issues/20123) - Introduce options to control adoption/replication of device components via REST API (replicates UI behavior) +* [#20152](https://github.com/netbox-community/netbox/issues/20152) - Support for marking module and device bays as disabled +* [#20162](https://github.com/netbox-community/netbox/issues/20162) - Provide an option to execute as a background job when adding components to devices in bulk +* [#20163](https://github.com/netbox-community/netbox/issues/20163) - Add changelog message support for bulk device component creation +* [#20698](https://github.com/netbox-community/netbox/issues/20698) - Add read-only `total_vlan_ids` attribute on VLAN group representation in REST & GraphQL APIs +* [#20916](https://github.com/netbox-community/netbox/issues/20916) - Include stack trace for unhandled exceptions in job logs +* [#21157](https://github.com/netbox-community/netbox/issues/21157) - Include all public model classes in export template context +* [#21409](https://github.com/netbox-community/netbox/issues/21409) - Introduce `CHANGELOG_RETAIN_CREATE_LAST_UPDATE` configuration parameter to retain creation & most recent update record in change log for each object +* [#21575](https://github.com/netbox-community/netbox/issues/21575) - Introduce `{vc_position}` template variable for device component template name/label +* [#21662](https://github.com/netbox-community/netbox/issues/21662) - Increase `rf_channel_frequency` precision to 3 decimal places +* [#21702](https://github.com/netbox-community/netbox/issues/21702) - Include a serialized representation of the HTTP request in each webhook +* [#21720](https://github.com/netbox-community/netbox/issues/21720) - Align HTTP basic auth regex of `EnhancedURLValidator` with Django's `URLValidator` +* [#21770](https://github.com/netbox-community/netbox/issues/21770) - Enable specifying columns to include/exclude on embedded tables +* [#21771](https://github.com/netbox-community/netbox/issues/21771) - Add support for partial tag assignment (`add_tags`) and removal (`remove_tags`) via REST API +* [#21780](https://github.com/netbox-community/netbox/issues/21780) - Add changelog message support to bulk creation of IP addresses +* [#21865](https://github.com/netbox-community/netbox/issues/21865) - Allow setting empty `INTERNAL_IPS` to enable debug toolbar for all clients + +### Performance + +* [#21455](https://github.com/netbox-community/netbox/issues/21455) - Ensure PostgreSQL indexes exist to support the default ordering of each model + +### Plugins + +* [#20924](https://github.com/netbox-community/netbox/issues/20924) - Introduce support for declarative layouts and reusable UI components +* [#21357](https://github.com/netbox-community/netbox/issues/21357) - Provide an API for plugins to register custom model actions (for permission assignment) + +### Deprecations + +* [#21284](https://github.com/netbox-community/netbox/issues/21284) - Deprecate the `username` and `request_id` fields in event data +* [#21304](https://github.com/netbox-community/netbox/issues/21304) - Deprecate the `housekeeping` management command +* [#21331](https://github.com/netbox-community/netbox/issues/21331) - Deprecate NetBox's custom `querystring` template tag +* [#21881](https://github.com/netbox-community/netbox/issues/21881) - Deprecate legacy Sentry configuration parameters +* [#21884](https://github.com/netbox-community/netbox/issues/21884) - Deprecate the obsolete `DEFAULT_ACTION_PERMISSIONS` mapping +* [#21887](https://github.com/netbox-community/netbox/issues/21887) - Deprecate support for legacy view actions +* [#21890](https://github.com/netbox-community/netbox/issues/21890) - Deprecate `models` key in application registry + +### Other Changes + +* [#20984](https://github.com/netbox-community/netbox/issues/20984) - Upgrade to Django 6.0 +* [#21635](https://github.com/netbox-community/netbox/issues/21635) - Migrate documentation site from mkdocs to Zensical + +### REST API Changes + +* New features: + * `ETag` response header and `If-Match` request header support for all individual object endpoints + * `start` query parameter for cursor-based pagination on all list endpoints + * `add_tags` and `remove_tags` write-only fields on all taggable model serializers +* New endpoints: + * `GET/POST /api/dcim/cable-bundles/` + * `GET/PUT/PATCH/DELETE /api/dcim/cable-bundles//` + * `GET/POST /api/dcim/rack-groups/` + * `GET/PUT/PATCH/DELETE /api/dcim/rack-groups//` + * `GET/POST /api/virtualization/virtual-machine-types/` + * `GET/PUT/PATCH/DELETE /api/virtualization/virtual-machine-types//` +* `dcim.Cable` + * Add optional foreign key field `bundle` +* `dcim.Device` + * The `primary_ip`, `primary_ip4`, `primary_ip6`, and `oob_ip` nested representations now include `nat_inside` and `nat_outside` +* `dcim.DeviceBay` + * Add boolean field `enabled` + * Add read-only boolean field `_occupied` +* `dcim.DeviceBayTemplate` + * Add boolean field `enabled` +* `dcim.Module` + * Add write-only boolean fields `replicate_components` and `adopt_components` +* `dcim.ModuleBay` + * Add boolean field `enabled` + * Add read-only boolean field `_occupied` +* `dcim.ModuleBayTemplate` + * Add boolean field `enabled` +* `dcim.Rack` + * Add optional foreign key field `group` +* `dcim.RackReservation` + * Add read-only integer field `unit_count` +* `extras.CustomField` + * Add JSON field `validation_schema` +* `ipam.ASN` + * Add optional foreign key field `role` +* `ipam.Role` + * Annotate count of assigned ASNs (`asn_count`) +* `ipam.VLANGroup` + * Add read-only field `total_vlan_ids` +* `virtualization.VirtualMachine` + * Add optional foreign key field `virtual_machine_type` + * The `primary_ip`, `primary_ip4`, and `primary_ip6` nested representations now include `nat_inside` and `nat_outside` + * The `cluster` field is now optional (nullable) diff --git a/mkdocs.yml b/mkdocs.yml index c4f288ad7..60bc2c643 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -327,6 +327,7 @@ nav: - git Cheat Sheet: 'development/git-cheat-sheet.md' - Release Notes: - Summary: 'release-notes/index.md' + - Version 4.6: 'release-notes/version-4.6.md' - Version 4.5: 'release-notes/version-4.5.md' - Version 4.4: 'release-notes/version-4.4.md' - Version 4.3: 'release-notes/version-4.3.md' diff --git a/netbox/dcim/api/serializers_/racks.py b/netbox/dcim/api/serializers_/racks.py index fcac4f567..2a4bd0834 100644 --- a/netbox/dcim/api/serializers_/racks.py +++ b/netbox/dcim/api/serializers_/racks.py @@ -1,4 +1,6 @@ from django.utils.translation import gettext as _ +from drf_spectacular.types import OpenApiTypes +from drf_spectacular.utils import extend_schema_field from rest_framework import serializers from dcim.choices import * @@ -175,6 +177,7 @@ class RackReservationSerializer(PrimaryModelSerializer): unit_count = serializers.SerializerMethodField() + @extend_schema_field(OpenApiTypes.INT32) def get_unit_count(self, obj): return len(obj.units) diff --git a/netbox/release.yaml b/netbox/release.yaml index e5adcfdeb..562d574a9 100644 --- a/netbox/release.yaml +++ b/netbox/release.yaml @@ -1,3 +1,4 @@ -version: "4.5.8" +version: "4.6.0" edition: "Community" published: "2026-04-14" +designation: "beta1" diff --git a/netbox/translations/cs/LC_MESSAGES/django.mo b/netbox/translations/cs/LC_MESSAGES/django.mo index dbb1c1c7ecf644fc7de253b8286e817a262d9671..282a4586f2d2675a52c22cfa7d7bb00111f39de6 100644 GIT binary patch delta 73496 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 delta 73515 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 b!DnZN3LkuTd#Jc01FwhL9(diiU7G&`OS1CJ diff --git a/netbox/translations/cs/LC_MESSAGES/django.po b/netbox/translations/cs/LC_MESSAGES/django.po index 0c5c3d0e6..9940f7eba 100644 --- a/netbox/translations/cs/LC_MESSAGES/django.po +++ b/netbox/translations/cs/LC_MESSAGES/django.po @@ -19,7 +19,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-04-10 05:39+0000\n" +"POT-Creation-Date: 2026-04-14 05:39+0000\n" "PO-Revision-Date: 2023-10-30 17:48+0000\n" "Last-Translator: Jeremy Stretch, 2026\n" "Language-Team: Czech (https://app.transifex.com/netbox-community/teams/178115/cs/)\n" @@ -184,8 +184,8 @@ msgstr "Skupina lokalit (zkratka)" #: netbox/dcim/forms/bulk_edit.py:329 netbox/dcim/forms/bulk_edit.py:679 #: netbox/dcim/forms/bulk_edit.py:866 netbox/dcim/forms/bulk_import.py:146 #: netbox/dcim/forms/bulk_import.py:247 netbox/dcim/forms/bulk_import.py:349 -#: netbox/dcim/forms/bulk_import.py:640 netbox/dcim/forms/bulk_import.py:1612 -#: netbox/dcim/forms/bulk_import.py:1640 netbox/dcim/forms/filtersets.py:106 +#: netbox/dcim/forms/bulk_import.py:640 netbox/dcim/forms/bulk_import.py:1659 +#: netbox/dcim/forms/bulk_import.py:1687 netbox/dcim/forms/filtersets.py:106 #: netbox/dcim/forms/filtersets.py:256 netbox/dcim/forms/filtersets.py:379 #: netbox/dcim/forms/filtersets.py:483 netbox/dcim/forms/filtersets.py:855 #: netbox/dcim/forms/filtersets.py:1073 netbox/dcim/forms/filtersets.py:1147 @@ -463,7 +463,7 @@ msgstr "ID služby" #: netbox/dcim/forms/bulk_edit.py:611 netbox/dcim/forms/bulk_edit.py:809 #: netbox/dcim/forms/bulk_edit.py:1063 netbox/dcim/forms/bulk_edit.py:1162 #: netbox/dcim/forms/bulk_edit.py:1189 netbox/dcim/forms/bulk_edit.py:1723 -#: netbox/dcim/forms/bulk_import.py:1484 netbox/dcim/forms/filtersets.py:1220 +#: netbox/dcim/forms/bulk_import.py:1500 netbox/dcim/forms/filtersets.py:1220 #: netbox/dcim/forms/filtersets.py:1545 netbox/dcim/forms/filtersets.py:1761 #: netbox/dcim/forms/filtersets.py:1780 netbox/dcim/forms/filtersets.py:1804 #: netbox/dcim/forms/filtersets.py:1823 netbox/dcim/tables/devices.py:806 @@ -495,8 +495,8 @@ msgstr "Barva" #: netbox/dcim/forms/bulk_import.py:813 netbox/dcim/forms/bulk_import.py:839 #: netbox/dcim/forms/bulk_import.py:865 netbox/dcim/forms/bulk_import.py:886 #: netbox/dcim/forms/bulk_import.py:972 netbox/dcim/forms/bulk_import.py:1101 -#: netbox/dcim/forms/bulk_import.py:1120 netbox/dcim/forms/bulk_import.py:1465 -#: netbox/dcim/forms/bulk_import.py:1677 netbox/dcim/forms/filtersets.py:1104 +#: netbox/dcim/forms/bulk_import.py:1120 netbox/dcim/forms/bulk_import.py:1481 +#: netbox/dcim/forms/bulk_import.py:1724 netbox/dcim/forms/filtersets.py:1104 #: netbox/dcim/forms/filtersets.py:1205 netbox/dcim/forms/filtersets.py:1333 #: netbox/dcim/forms/filtersets.py:1424 netbox/dcim/forms/filtersets.py:1444 #: netbox/dcim/forms/filtersets.py:1464 netbox/dcim/forms/filtersets.py:1484 @@ -554,8 +554,8 @@ msgstr "Účet poskytovatele" #: netbox/dcim/forms/bulk_import.py:103 netbox/dcim/forms/bulk_import.py:162 #: netbox/dcim/forms/bulk_import.py:265 netbox/dcim/forms/bulk_import.py:374 #: netbox/dcim/forms/bulk_import.py:605 netbox/dcim/forms/bulk_import.py:765 -#: netbox/dcim/forms/bulk_import.py:1230 netbox/dcim/forms/bulk_import.py:1453 -#: netbox/dcim/forms/bulk_import.py:1672 netbox/dcim/forms/bulk_import.py:1735 +#: netbox/dcim/forms/bulk_import.py:1230 netbox/dcim/forms/bulk_import.py:1469 +#: netbox/dcim/forms/bulk_import.py:1719 netbox/dcim/forms/bulk_import.py:1782 #: netbox/dcim/forms/filtersets.py:208 netbox/dcim/forms/filtersets.py:268 #: netbox/dcim/forms/filtersets.py:396 netbox/dcim/forms/filtersets.py:504 #: netbox/dcim/forms/filtersets.py:901 netbox/dcim/forms/filtersets.py:1024 @@ -616,8 +616,8 @@ msgstr "Stav" #: netbox/dcim/forms/bulk_edit.py:799 netbox/dcim/forms/bulk_edit.py:1746 #: netbox/dcim/forms/bulk_import.py:122 netbox/dcim/forms/bulk_import.py:167 #: netbox/dcim/forms/bulk_import.py:258 netbox/dcim/forms/bulk_import.py:379 -#: netbox/dcim/forms/bulk_import.py:579 netbox/dcim/forms/bulk_import.py:1471 -#: netbox/dcim/forms/bulk_import.py:1728 netbox/dcim/forms/filtersets.py:143 +#: netbox/dcim/forms/bulk_import.py:579 netbox/dcim/forms/bulk_import.py:1487 +#: netbox/dcim/forms/bulk_import.py:1775 netbox/dcim/forms/filtersets.py:143 #: netbox/dcim/forms/filtersets.py:202 netbox/dcim/forms/filtersets.py:235 #: netbox/dcim/forms/filtersets.py:363 netbox/dcim/forms/filtersets.py:442 #: netbox/dcim/forms/filtersets.py:463 netbox/dcim/forms/filtersets.py:823 @@ -803,7 +803,7 @@ msgstr "Popis" #: netbox/circuits/forms/bulk_edit.py:192 #: netbox/circuits/forms/model_forms.py:199 -#: netbox/dcim/forms/bulk_import.py:1419 netbox/dcim/forms/bulk_import.py:1444 +#: netbox/dcim/forms/bulk_import.py:1427 netbox/dcim/forms/bulk_import.py:1460 msgid "Termination type" msgstr "Typ ukončení" @@ -933,7 +933,7 @@ msgstr "Typ okruhu" #: netbox/dcim/forms/bulk_import.py:105 netbox/dcim/forms/bulk_import.py:164 #: netbox/dcim/forms/bulk_import.py:267 netbox/dcim/forms/bulk_import.py:376 #: netbox/dcim/forms/bulk_import.py:607 netbox/dcim/forms/bulk_import.py:767 -#: netbox/dcim/forms/bulk_import.py:1232 netbox/dcim/forms/bulk_import.py:1674 +#: netbox/dcim/forms/bulk_import.py:1232 netbox/dcim/forms/bulk_import.py:1721 #: netbox/ipam/forms/bulk_import.py:200 netbox/ipam/forms/bulk_import.py:264 #: netbox/ipam/forms/bulk_import.py:300 netbox/ipam/forms/bulk_import.py:531 #: netbox/ipam/forms/bulk_import.py:544 @@ -949,8 +949,8 @@ msgstr "Provozní stav" #: netbox/circuits/forms/bulk_import.py:235 #: netbox/dcim/forms/bulk_import.py:126 netbox/dcim/forms/bulk_import.py:171 #: netbox/dcim/forms/bulk_import.py:383 netbox/dcim/forms/bulk_import.py:583 -#: netbox/dcim/forms/bulk_import.py:1475 netbox/dcim/forms/bulk_import.py:1669 -#: netbox/dcim/forms/bulk_import.py:1732 netbox/ipam/forms/bulk_import.py:49 +#: netbox/dcim/forms/bulk_import.py:1491 netbox/dcim/forms/bulk_import.py:1716 +#: netbox/dcim/forms/bulk_import.py:1779 netbox/ipam/forms/bulk_import.py:49 #: netbox/ipam/forms/bulk_import.py:78 netbox/ipam/forms/bulk_import.py:106 #: netbox/ipam/forms/bulk_import.py:126 netbox/ipam/forms/bulk_import.py:146 #: netbox/ipam/forms/bulk_import.py:174 netbox/ipam/forms/bulk_import.py:259 @@ -1023,8 +1023,8 @@ msgstr "Rozhraní" #: netbox/dcim/forms/bulk_edit.py:445 netbox/dcim/forms/bulk_edit.py:684 #: netbox/dcim/forms/bulk_edit.py:733 netbox/dcim/forms/bulk_edit.py:875 #: netbox/dcim/forms/bulk_import.py:252 netbox/dcim/forms/bulk_import.py:355 -#: netbox/dcim/forms/bulk_import.py:646 netbox/dcim/forms/bulk_import.py:1618 -#: netbox/dcim/forms/bulk_import.py:1652 netbox/dcim/forms/filtersets.py:114 +#: netbox/dcim/forms/bulk_import.py:646 netbox/dcim/forms/bulk_import.py:1665 +#: netbox/dcim/forms/bulk_import.py:1699 netbox/dcim/forms/filtersets.py:114 #: netbox/dcim/forms/filtersets.py:358 netbox/dcim/forms/filtersets.py:393 #: netbox/dcim/forms/filtersets.py:438 netbox/dcim/forms/filtersets.py:491 #: netbox/dcim/forms/filtersets.py:820 netbox/dcim/forms/filtersets.py:864 @@ -1451,7 +1451,7 @@ msgstr "Ukončení obvodu se musí připojit k zakončujícímu objektu." #: netbox/extras/models/models.py:417 netbox/extras/models/models.py:482 #: netbox/extras/models/models.py:567 netbox/extras/models/models.py:692 #: netbox/extras/models/notifications.py:126 -#: netbox/extras/models/scripts.py:31 netbox/ipam/models/asns.py:18 +#: netbox/extras/models/scripts.py:29 netbox/ipam/models/asns.py:18 #: netbox/ipam/models/fhrp.py:24 netbox/ipam/models/services.py:51 #: netbox/ipam/models/services.py:80 netbox/ipam/models/vlans.py:38 #: netbox/ipam/models/vlans.py:217 netbox/ipam/models/vlans.py:363 @@ -1696,7 +1696,7 @@ msgstr "Zakončení" #: netbox/dcim/forms/bulk_import.py:1096 netbox/dcim/forms/bulk_import.py:1115 #: netbox/dcim/forms/bulk_import.py:1134 netbox/dcim/forms/bulk_import.py:1146 #: netbox/dcim/forms/bulk_import.py:1194 netbox/dcim/forms/bulk_import.py:1316 -#: netbox/dcim/forms/bulk_import.py:1722 netbox/dcim/forms/connections.py:34 +#: netbox/dcim/forms/bulk_import.py:1769 netbox/dcim/forms/connections.py:34 #: netbox/dcim/forms/filtersets.py:156 netbox/dcim/forms/filtersets.py:1021 #: netbox/dcim/forms/filtersets.py:1054 netbox/dcim/forms/filtersets.py:1202 #: netbox/dcim/forms/filtersets.py:1418 netbox/dcim/forms/filtersets.py:1441 @@ -4302,8 +4302,8 @@ msgstr "Proudění vzduchu" #: netbox/dcim/forms/bulk_edit.py:444 netbox/dcim/forms/bulk_edit.py:897 #: netbox/dcim/forms/bulk_import.py:362 netbox/dcim/forms/bulk_import.py:365 -#: netbox/dcim/forms/bulk_import.py:653 netbox/dcim/forms/bulk_import.py:1659 -#: netbox/dcim/forms/bulk_import.py:1663 netbox/dcim/forms/filtersets.py:123 +#: netbox/dcim/forms/bulk_import.py:653 netbox/dcim/forms/bulk_import.py:1706 +#: netbox/dcim/forms/bulk_import.py:1710 netbox/dcim/forms/filtersets.py:123 #: netbox/dcim/forms/filtersets.py:359 netbox/dcim/forms/filtersets.py:448 #: netbox/dcim/forms/filtersets.py:462 netbox/dcim/forms/filtersets.py:501 #: netbox/dcim/forms/filtersets.py:874 netbox/dcim/forms/filtersets.py:1086 @@ -4364,7 +4364,7 @@ msgstr "Schéma" #: netbox/dcim/forms/bulk_edit.py:555 netbox/dcim/forms/bulk_edit.py:562 #: netbox/dcim/forms/bulk_edit.py:793 netbox/dcim/forms/bulk_import.py:460 -#: netbox/dcim/forms/bulk_import.py:1459 netbox/dcim/forms/filtersets.py:690 +#: netbox/dcim/forms/bulk_import.py:1475 netbox/dcim/forms/filtersets.py:690 #: netbox/dcim/forms/filtersets.py:1215 netbox/dcim/forms/model_forms.py:444 #: netbox/dcim/forms/model_forms.py:457 netbox/dcim/tables/modules.py:43 #: netbox/extras/forms/filtersets.py:413 @@ -4489,8 +4489,8 @@ msgstr "Štítek" msgid "Length" msgstr "Délka" -#: netbox/dcim/forms/bulk_edit.py:818 netbox/dcim/forms/bulk_import.py:1478 -#: netbox/dcim/forms/bulk_import.py:1481 netbox/dcim/forms/filtersets.py:1228 +#: netbox/dcim/forms/bulk_edit.py:818 netbox/dcim/forms/bulk_import.py:1494 +#: netbox/dcim/forms/bulk_import.py:1497 netbox/dcim/forms/filtersets.py:1228 msgid "Length unit" msgstr "Jednotka délky" @@ -4498,17 +4498,17 @@ msgstr "Jednotka délky" msgid "Domain" msgstr "Doména" -#: netbox/dcim/forms/bulk_edit.py:892 netbox/dcim/forms/bulk_import.py:1646 +#: netbox/dcim/forms/bulk_edit.py:892 netbox/dcim/forms/bulk_import.py:1693 #: netbox/dcim/forms/filtersets.py:1316 netbox/dcim/forms/model_forms.py:891 msgid "Power panel" msgstr "Napájecí panel" -#: netbox/dcim/forms/bulk_edit.py:914 netbox/dcim/forms/bulk_import.py:1682 +#: netbox/dcim/forms/bulk_edit.py:914 netbox/dcim/forms/bulk_import.py:1729 #: netbox/dcim/forms/filtersets.py:1338 msgid "Supply" msgstr "Zdroj" -#: netbox/dcim/forms/bulk_edit.py:920 netbox/dcim/forms/bulk_import.py:1687 +#: netbox/dcim/forms/bulk_edit.py:920 netbox/dcim/forms/bulk_import.py:1734 #: netbox/dcim/forms/filtersets.py:1343 msgid "Phase" msgstr "Fáze" @@ -4739,7 +4739,7 @@ msgid "available options" msgstr "dostupné možnosti" #: netbox/dcim/forms/bulk_import.py:149 netbox/dcim/forms/bulk_import.py:643 -#: netbox/dcim/forms/bulk_import.py:1643 netbox/ipam/forms/bulk_import.py:512 +#: netbox/dcim/forms/bulk_import.py:1690 netbox/ipam/forms/bulk_import.py:512 #: netbox/virtualization/forms/bulk_import.py:64 #: netbox/virtualization/forms/bulk_import.py:102 msgid "Assigned site" @@ -4802,7 +4802,7 @@ msgstr "Pokud není zadán typ stojanu, musí být nastavena výška U." msgid "Parent site" msgstr "Nadřazená lokalita" -#: netbox/dcim/forms/bulk_import.py:359 netbox/dcim/forms/bulk_import.py:1656 +#: netbox/dcim/forms/bulk_import.py:359 netbox/dcim/forms/bulk_import.py:1703 msgid "Rack's location (if any)" msgstr "Umístění stojanu (pokud existuje)" @@ -4868,7 +4868,7 @@ msgstr "Platforma nebyla nalezena." msgid "Limit platform assignments to this manufacturer" msgstr "Omezte přiřazení platformy tomuto výrobci" -#: netbox/dcim/forms/bulk_import.py:576 netbox/dcim/forms/bulk_import.py:1725 +#: netbox/dcim/forms/bulk_import.py:576 netbox/dcim/forms/bulk_import.py:1772 #: netbox/tenancy/forms/bulk_import.py:116 msgid "Assigned role" msgstr "Přidělená role" @@ -5077,7 +5077,7 @@ msgid "VDC {vdc} is not assigned to device {device}" msgstr "VDC {vdc} není přiřazen k zařízení {device}" #: netbox/dcim/forms/bulk_import.py:1103 netbox/dcim/forms/bulk_import.py:1121 -#: netbox/dcim/forms/bulk_import.py:1468 +#: netbox/dcim/forms/bulk_import.py:1484 msgid "Physical medium classification" msgstr "Klasifikace fyzického média" @@ -5176,68 +5176,91 @@ msgstr "Lokalita rodičovského zařízení A (pokud existuje)" msgid "Side A device" msgstr "Zařízení na straně A" -#: netbox/dcim/forms/bulk_import.py:1413 netbox/dcim/forms/bulk_import.py:1438 -msgid "Device name" -msgstr "Název zařízení" +#: netbox/dcim/forms/bulk_import.py:1414 netbox/dcim/forms/bulk_import.py:1447 +msgid "Device name (for device component terminations)" +msgstr "" -#: netbox/dcim/forms/bulk_import.py:1416 +#: netbox/dcim/forms/bulk_import.py:1417 +msgid "Side A power panel" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1421 netbox/dcim/forms/bulk_import.py:1454 +msgid "Power panel name (for power feed terminations)" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1424 msgid "Side A type" msgstr "Typ strany A" -#: netbox/dcim/forms/bulk_import.py:1422 +#: netbox/dcim/forms/bulk_import.py:1430 msgid "Side A name" msgstr "Jméno strany A" -#: netbox/dcim/forms/bulk_import.py:1423 netbox/dcim/forms/bulk_import.py:1448 +#: netbox/dcim/forms/bulk_import.py:1431 netbox/dcim/forms/bulk_import.py:1464 msgid "Termination name" msgstr "Název ukončení" -#: netbox/dcim/forms/bulk_import.py:1428 +#: netbox/dcim/forms/bulk_import.py:1436 msgid "Side B site" msgstr "Lokalita na straně B" -#: netbox/dcim/forms/bulk_import.py:1432 +#: netbox/dcim/forms/bulk_import.py:1440 #: netbox/wireless/forms/bulk_import.py:114 msgid "Site of parent device B (if any)" msgstr "Lokalita rodičovského zařízení B (pokud existuje)" -#: netbox/dcim/forms/bulk_import.py:1435 +#: netbox/dcim/forms/bulk_import.py:1443 msgid "Side B device" msgstr "Zařízení na straně B" -#: netbox/dcim/forms/bulk_import.py:1441 +#: netbox/dcim/forms/bulk_import.py:1450 +msgid "Side B power panel" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1457 msgid "Side B type" msgstr "Typ strany B" -#: netbox/dcim/forms/bulk_import.py:1447 +#: netbox/dcim/forms/bulk_import.py:1463 msgid "Side B name" msgstr "Název strany B" -#: netbox/dcim/forms/bulk_import.py:1456 +#: netbox/dcim/forms/bulk_import.py:1472 #: netbox/templates/dcim/panels/connection.html:60 #: netbox/wireless/forms/bulk_import.py:133 msgid "Connection status" msgstr "Stav připojení" -#: netbox/dcim/forms/bulk_import.py:1462 +#: netbox/dcim/forms/bulk_import.py:1478 msgid "Cable connection profile" msgstr "Profil připojení kabelu" -#: netbox/dcim/forms/bulk_import.py:1487 +#: netbox/dcim/forms/bulk_import.py:1503 msgid "Color name (e.g. \"Red\") or hex code (e.g. \"f44336\")" msgstr "Název barvy (např. „Červená“) nebo hexadecimální kód (např. „f44336“)" -#: netbox/dcim/forms/bulk_import.py:1542 +#: netbox/dcim/forms/bulk_import.py:1564 +#, python-brace-format +msgid "" +"Side {side_upper}: {power_panel} {termination_object} is already connected" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1570 +#, python-brace-format +msgid "{side_upper} side termination not found: {power_panel} {name}" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1588 #, python-brace-format msgid "Side {side_upper}: {device} {termination_object} is already connected" msgstr "Strana {side_upper}: {device} {termination_object} je již připojeno" -#: netbox/dcim/forms/bulk_import.py:1548 +#: netbox/dcim/forms/bulk_import.py:1594 #, python-brace-format msgid "{side_upper} side termination not found: {device} {name}" msgstr "Zakončení strany {side_upper} nebylo nalezeno: {device} {name}" -#: netbox/dcim/forms/bulk_import.py:1569 +#: netbox/dcim/forms/bulk_import.py:1616 #, python-brace-format msgid "" "{color} did not match any used color name and was longer than six " @@ -5246,53 +5269,53 @@ msgstr "" "{color} neodpovídal žádnému použitému názvu barvy a byl delší než šest " "znaků: neplatný hex." -#: netbox/dcim/forms/bulk_import.py:1594 netbox/dcim/forms/model_forms.py:926 +#: netbox/dcim/forms/bulk_import.py:1641 netbox/dcim/forms/model_forms.py:926 #: netbox/dcim/tables/devices.py:1144 #: netbox/templates/dcim/panels/virtual_chassis_members.html:10 msgid "Master" msgstr "Hlavní" -#: netbox/dcim/forms/bulk_import.py:1598 +#: netbox/dcim/forms/bulk_import.py:1645 msgid "Master device" msgstr "Hlavní zařízení" -#: netbox/dcim/forms/bulk_import.py:1615 +#: netbox/dcim/forms/bulk_import.py:1662 msgid "Name of parent site" msgstr "Název nadřazené lokality" -#: netbox/dcim/forms/bulk_import.py:1649 +#: netbox/dcim/forms/bulk_import.py:1696 msgid "Upstream power panel" msgstr "Nadřazený napájecí panel" -#: netbox/dcim/forms/bulk_import.py:1679 +#: netbox/dcim/forms/bulk_import.py:1726 msgid "Primary or redundant" msgstr "Primární nebo redundantní" -#: netbox/dcim/forms/bulk_import.py:1684 +#: netbox/dcim/forms/bulk_import.py:1731 msgid "Supply type (AC/DC)" msgstr "Typ napájení (AC/DC)" -#: netbox/dcim/forms/bulk_import.py:1689 +#: netbox/dcim/forms/bulk_import.py:1736 msgid "Single or three-phase" msgstr "Jednofázové nebo třífázové" -#: netbox/dcim/forms/bulk_import.py:1739 netbox/dcim/forms/model_forms.py:1901 +#: netbox/dcim/forms/bulk_import.py:1786 netbox/dcim/forms/model_forms.py:1901 #: netbox/dcim/ui/panels.py:110 netbox/dcim/ui/panels.py:354 #: netbox/virtualization/ui/panels.py:28 msgid "Primary IPv4" msgstr "Primární IPv4" -#: netbox/dcim/forms/bulk_import.py:1743 +#: netbox/dcim/forms/bulk_import.py:1790 msgid "IPv4 address with mask, e.g. 1.2.3.4/24" msgstr "IPv4 adresa s maskou, např. 1.2.3.4/24" -#: netbox/dcim/forms/bulk_import.py:1746 netbox/dcim/forms/model_forms.py:1910 +#: netbox/dcim/forms/bulk_import.py:1793 netbox/dcim/forms/model_forms.py:1910 #: netbox/dcim/ui/panels.py:115 netbox/dcim/ui/panels.py:359 #: netbox/virtualization/ui/panels.py:33 msgid "Primary IPv6" msgstr "Primární IPv6" -#: netbox/dcim/forms/bulk_import.py:1750 +#: netbox/dcim/forms/bulk_import.py:1797 msgid "IPv6 address with prefix length, e.g. 2001:db8::1/64" msgstr "IPv6 adresa s délkou předpony, např. 2001:db8: :1/64" @@ -9989,23 +10012,23 @@ msgstr "předplatné" msgid "subscriptions" msgstr "předplatné" -#: netbox/extras/models/scripts.py:43 +#: netbox/extras/models/scripts.py:41 msgid "is executable" msgstr "je spustitelný" -#: netbox/extras/models/scripts.py:65 +#: netbox/extras/models/scripts.py:63 msgid "script" msgstr "skript" -#: netbox/extras/models/scripts.py:66 +#: netbox/extras/models/scripts.py:64 msgid "scripts" msgstr "skripty" -#: netbox/extras/models/scripts.py:112 +#: netbox/extras/models/scripts.py:110 msgid "script module" msgstr "skriptový modul" -#: netbox/extras/models/scripts.py:113 +#: netbox/extras/models/scripts.py:111 msgid "script modules" msgstr "skriptové moduly" diff --git a/netbox/translations/da/LC_MESSAGES/django.mo b/netbox/translations/da/LC_MESSAGES/django.mo index baee82cdb110182486a2be3c444ae8640db9b42e..26e4610994744075bfc3f680be8f225c356aa9ee 100644 GIT binary patch delta 73465 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 delta 73484 zcmXWkcfgKSAHeb3BgzihWben`3Xi?_CNncc5t7`gXlZ99+6pBpqM?*kL>XzJ-i#>G zkcN1_-}{{RpU-v9b*^)M=XcJz?)!PjyM0rhUpD1Q9?o~!`~?4-mMf7cj{Cn--EzDLbQ{q~@20P+(9EMwPBvvS$DUl!NVQzc| z877%{jf*R(*c>Vnd+`d&N3jB)#w>VMnP5@8jB=@HdCW(-N-Q^t3G>{iD2d+nF_+j+Z=$CjE^*^8)`zzKLC>z?B!po_ziq5nSI$#U5 z|E}nGLoqw!CvNrvZ;#%K4)Ay^zZ`u7?O+oY#64(7$I*cQiuW%o7s>_DeoNy*Ovf3x z1>0h?@|hAz*XkZFD&sz^kN;s~tXm;dA}dbB1~?V1UyaT1B=*9}6*DDz;w+qid$A2> zRLYbXgZE%dJR7ZBIa8uG<>{3(B~urxsJMoT!`KgtR>_oTh?B7%zJg8he^>`gSIv}Y zhrMwiF2fG^57xxi>0u&MqpxBu>W@YXRtx>MtCkEGv#2lwZ=$>Va5QW6P+vXT4_k2m zPIR|##qyX|BMevxP5BUX58Qy+@Md%q&&14lC%Vb!CS!w#ql?iFo{#0#vAhA@^&g>Y zz5@&3*LXFaMVBg1%}fbSa-tx*>B^x4)j|Vm9PhWlJd~5&;>FPDB=mth&<^iIJA5R% z4Bc$6pdD^NQ~Lqh{x@`nf1~~Uhd!URRyhAxq0d(eCKGkJ@R($vGwX_GU>F+Vcr1-G z(Fd2I?N_2R+=!n4ZD{+i;{B88-uVmduX^neP@`yzl$^hgT-cx&dc2099Zib$cc3$Q z0DXf!5q&w{e;0jjJ9;d?L<2j6PUr#}cUz>{}n1MDNfDSYY4QvJ) z&>VE2`Dj4PN!$3XIlnp>P z(Rg&GlhBB7#j^MYmcxVS3+Vzj!3GV&^S7Yyi+j+4x1kyR44uePH1OXWaQ-v6$l5Tx z%iE$$FajULN%#zAZWLb0FQ6T5jDCuC^nLUXTuS-!#+ec&GVxi0Jt%*4O?Xolyf&PY zacIVFPIBQ4r=zK#jlNhm#PT`x)tlZVymCiiA<8eHYyB=(z~g9!ay1Q^Ym0*@cSMir z3N-N7u`q5$KfIEMxhTQKzp8(T-@OL(vz|D0KIZ!<%qAw!>5C=Y5@wOo;(F zA5HyP^!)!5y`p)jFNiEf<3uSgY)}L3xJhi#0sR#0g=T0hy7_KKXK?4^uV0ZrY0W#a z<<97L=%>dyw8!c#!m3|`mOG#$_C<3tGTy%xUHp5|ck2^q`<3W+ehWR|J7W1r3$}0S z8?HvrK`nF&J)>i=DCOJH#a@I?U{Ab%1l|6BM6t=pv0r&&M1zrHjyxR>%7v#`71FyDZE@l`aSEbYPrdC&}%Mwg@p+HouN8$?I+oV>!D~?W}FJ9)?*YR99z)k3b)1z}^{S#{ft^?z51=1US9HyksETdSue&#+@7~qe9d}^{ zUfnIc)Q4al%5%|U`8N6<_%52cJLlhBU!i+wI2IjnDf;>N8BW7<=&6{{BYaQZiZv)- z*)x1c%D~=~r(%EHg*~xCuaKb`Xuxk_7yKO!tVObS{K){TQ?VK=;-P4kKH*JQ4GnAr z+VMiPgP+jUmh2mrt`fQz>Y^EJj%KtYn(`j#i)s*h3X&7J@RR;dbZs`H4}OgKaUa&j z6Y+lWeqnc)LpM?VSZ;-WuJ%DcM{h(k^fKD+OSHe^SP%a}0!b!n_74MRpfhTRHk^q@ z{0O>9m!LCy7CmmOV|gr2~To+Eym6%R_b96~=#LGSZw{T%Z zx1%$BAeI-QkuOIFSchij19a{7qtBg0GjcxGXCD-fZAtV)sv)+)9%%oI(HGQmO!{%U zfeSm{htBK-n)0*JKhYFlh-Mue0=p8;SV?q%2Iw1a7W({r^tmPIz%Qa1TN}%759a(k zgY8r}(*yCwQMCTo=p}T9xrT(9mqOduLpyGT&Zs*&k?Yatr=b&?gAV)<8rT9fqfZS< zhE4Yp74F(^(1rzuh7L=h57a<+b3N>VBhfEu8_@RohlPQPp_{NA`X;T12HG6`!qN?$ z$UU+C$s`x1Xhrl5boai8cJyhiKa8&Vk7$SgMRN`h$+yH*#Uex1*_iFgBQvcDyS3ZoK~~ny~}1{s=mOv*;f97fpSxkzp?sLH9^C zG?2!zz8zlW`M)kUxCxDH7TWL$bTd7Ne$!u%F2O!@fFIF-|3C-0fKDXas5o%68k*7O zXusW}gRS@ckLSV;Zj0U<8_bX8=VN(IbW?N}n$oY)z)qw6q>T;(=5H`T4(3I^**Y*cA@?X$)=g|PNj15as4DGNYdcSTgw?Nx< z#fmr*4dg+z|0l+B{(bOyD%|C3& zPRF`98U1qlGWy-|7@DcF6T>F2jJZAkwYc!yX2cua&|TgyIu_mKGtkZSB&PNXI`bXq zTAx9m%QPvp%ZIkBgdV>P^m{?CSe}YCJ^%M}VM^Y?8n_#s`9&OqId2L9-hytfIq0|8 z7tl4_j;--C^jsIbIqZdQ=*0S>r))GD;6(IW^BtJydyir%EIK)O4VvQXqNC9@ zzZp&CY_!9BqKnWyumW4*Ivk1r#QLFALSW<3c9W;X&;KM9&g8-9g4p0`G_|YH&G=p{ ze}c~JTePE}IZNwxUar`PR@u zPBgGW=y9wX>)WEIp$B>#Z$>+s7VpnNH{l~_V4q+Y+>2(c^o+2#s$o~pe-|#wb7L7A z$QE>yrQH?+%8L$A6z!lAdcQ8Zd0V1^+=ni~L+A|GqOaPG=)}&UnY@TjD921E%K59v zg*R%W4>m(zNNv!8Z^d?a5Bg&H3_UGbZVx|(XzYVCuoixfsf^AFrzI!)Ldu5* z+!a&5zV5|^Yc?ExU;>)DsaOhUp+Wt6t41bOF=g|+RvTW)$I2e22i|A(j z3*A%M?g)FM7$)77b-3__(gBCz1T=s>Xa)|VpNhw#|DXfqnH_#b(*a$YE@(gl&?Op* z?uCii7gt~h%yehiyq)gk{QFAnLxrgwj}G)K8o>JKCNwkKa2@VJQ#|Lc@Kf_!IF#~n zw4b(j2WMh^%CDoT{}BzS{G4#?hs+@*EvR^git6|SPQiS0!&=^hc6b=gRQ`Ly469%% z$~Dnr)*TIeEP8xrp%Yk$?y0Ba{pIL{-$B1qexBsQckwUin&!MWq_R-7ELvY9mK&of zZWGI$&?V}Jz7IyB0ZhUQcpnbHHE2LN?h66sNBd0{<-*9zqifa}eYLhnH%0B5|f3$-U=q{atZmPNQ{$ug} zQZ$9HqD%4-+U{%gSRF_A%1^QW4|E9<4}?H2N0+QHUhes?$%QFxh&F5*8?=t)L1>2~ zq7%@8reZa`4Gnk&I>UF+H|NJ_V29BDPsaOaunOh>F!jgRmF9&PP93!4QD{oXp=&w= z?da}U|46KV8cAVd1-f~^Km*P4V5rZH4tx!Izd6>xN!SXX!DJgQj&X4xrau&q9lGl` zp&kB?&hP^Irpx_sShCXSdm|m~xGVadFNp@c0d2np-Q)++44*?Yb>U&ozY%7CBy@Ns z`e3nGu88i5+Gt8!#QS~F4u+$ws>F8d%9nIXm(Z{d|<)_fSvmTw;u17fk4sd`9 zQ+W(6=X*4~*~*|1SBT|mcmw5H=rMaL-d`8X@1herfKKEaw7(N*fal}=3$dJ*d@MY0 zIU0E`^uwrdv^;uzYNJcg5{$D=8~9Zlf_Xh+YYnRo-8=`M8hev2;IPw3iTiuX%A5sqy&Ag?>KIMrW`To#_kc3+Od8m0Qpme2lg`fClz08t89mfQk8G=J}!}(SXx2 z_51(UT$r*BsS3UeVtLB_(T1Ecgs)mxqi?>hXdvU!)XzXC za!;&(%zEBGiD%-CSJ6ytKqKE_1N=JHpFlf2kIp>H!q8z}v|Vv@2`i%$svYlNi}u?V zZPyolegr0cU=kNTa4R~~yU_aeXsX{w*K`Zo!9FyQ?_&Kg=m7u4a;`-&Aao*?(Y&z8*6)wy<7hzVup*`{4j;=^(0)6jKQRqO z+a<9s&O`g(yqNRvH<^7@RKVO%hVORuunFaH=pI;sFW?%qquxuxu^o<{k}+t9x1!%C z9zdVl9qSLEDL;V*^gEWqe95Om!#ZfhjnPbWMQ1)39q`6@|28y*kHqpawEY`s`w!6p z_QvwB=w{5cGz5Az`g{%axnvVATu?F>X(SX*YncReK_MMpe`TqbHMsyTiqjS+r&xC<;VJ+&*Vjb*_>3APj z!}VAbkD|M}z_TH9mC%{jK_}Q2&2)cs6Ao9;|3WUD(Jm~9|HIOF`E%hZ#e6DE z@kz8??B(#_M7*BzMr@8HR)jSlf*#vx=&4zY2Dlwv^RwutEwwV(7k#lkgf7))Y=ytA zOoq+SU{zS7=IAEuiLTvnbbzVo@p>S-1l>fd&`q^2`eCf!gD%Bav3w5QTbE*ej#t8S z6_Z?e9_yk5w?L0w_vm%#?j4ODuZiffy9MoV23Enj_#VEFekGguYS?U#p%YkwuKgPH z{$6xxlIOU%lZ$4nX_$!@2>K~^@U;-wH|Rho(ZJ539VXU<`vuVZWzmoC8tBYBpqq45 zte=Bs^cnPP`-NooUwBL#lJ5nYkKW>vZ(hIvVTXO7vJAMwj9&8sI-@ zhO(>;_p_tr;%Ej-qwOkUPQU-x=EBX=3_ZV7(T?wn#Ml?eopflfs2KpKL z{9$Z`zoG-yek7 z=pNdNW^z9o*th7L@)SCOv^T?hB^xG7QBj8rJL-i-JQVF<6dKTt@&2u`JO@qbBj|CP zAIn>#pP(N)d(h{9Mo-UqbRw6p3mM3}j`Qyi3`MDMz@F#>1JOW6q2JrbV@aHgcCZ|s z*%};yo3Ip?T_4^9tqn!b#wr9e}>0iDqM=z!bNQ*$8JpF)@HwxMA%JlL6X0kq@m z(T*m@^6glT@_lH#)$#rXG@$GoL!h~%h0*#l=+ad{H*2yg7k>IR#j4m9eMR1eRqz$` zU40PE&{c1T)Rm0ZKxfhnJvE)s%nio!crzOKB6PszXdoMr2`3Zpg^R>CG^Kl@htZBt z$MQdDpxNFD0Te|Cs)BxcHpSE?Ml(7zmPexjOpeaR)DmLq_kWAIa5KD+s^HCpKJb35 z|1{PgLf>3J#`~Ah4CQ(^Q(_i2L<4>c4Rj0osy%>a<}WlO+20Fq%9@z^{a;5eoO%D~ z7;*Ir(Rhzl94U--kB*0o}D{(V72=sXc(cqH}&60xf{y2radqX`^NhN&;Ul_m5iU5!i59OLBFFd#B|(f13ZoycphErhM$B~-hg!}-;QQt zE!y!9Xa;^mH(l19p}sh}$*ZD!tPv(XM%Qs+s&7Icd;rbJ(`W#%p&fq^-Gip`aJ>H~ zI?(02!pC$8bgi498R&)%+#Ai*^=N-L?&AD=|SBK#zUO`LE8!Dk@yFuhD_OkLA;72Y;Xur|k~r zMcb7^@2AId<7gW+z#iyxL!vjL$Mkmei^)q#F6`(d^jz;j*YXnjV9h50W;Br8pNG%? zX6TD(CN{#?@OnIn2Gn_P_*rlgx_mkiz>i zrM}BGM%R2Gw!~49?=Ot?FQDz#p#yD3Q@kU(H~KBQCyt{_b1Ih4VA7QQ&V?PNeGyWW zJ6ZybJRJ?70eZ|jpaTt#_s5_COpfIl=-SUgpL;yI99^=F@&4{FIRB>jTPiBy1vEwF z4~7>~J@lA#Mfb)y^jED9Vp&{;>9_~WsP=lw3sxDcB9Qs@L4pc89@ z_CE&w&B%1j=lNgAg%PfdzJ?yJH_=Epp)ZVW=o0KfJ3530a2h?9Ild3&lIZhIV!17P zN=Bj?dJGNlD@>jLvt0OjehE8cq5p+}N214U0{Q}Z6b)p4bXoMJ=o&Qj8>1hf6Wbo| z@4^a{55)Ql|BIjhnSKaslLwtq=~!-t&ZIk=h^w{2xZr;byP4^6T z$GzwtD|a-UmU?KQ?T#ixhh3@gh0q)Acr>~PZbmztg{J<2Sid;dzlgS98|&Xg`}sJQ zzd@frfd=>o+E4alq5r~3E>e-99o0kEHUnMLZfGDQ&~rWsJ+61511&|{zlLtM_oKUG z{UP-E)99P_?^rH!JY*nQo(l&`Mk>y1AEm{+F zsivUM&5Y$a=mZ}`H{l{AGs(meE}Y5F=&rmNZX^o)80yQQ^>xvibVLL0i@w>$p`Q_V zqbYs{eKD;^1K5cMv_JZ7ynhr^zyJH23ult`Wcb;w0Qz7Tbo2E^2Ofql)r5F|R`eb; zbB~})u`Ie8o!BO{|Ig6pkHq@3mOcMzr$XfU(RXuYv|+1Q-y5CLI5eO;&`ouJEH6ZN z^RwtcFURs*Xg{0K3G6|i`vwi{M@;&Ax_`JZrG2 zMVDxQynhHC_Z9e1Xh(FwKIqzx#4dOX z+QF81e>a-yLuk8SV)-Htpq%HIP=5msr#u7e*gnZcRW95Ic5Bg&H(@i} zg$*(1Z{ZxbMg!@Ln{X()NlX47o*#|gpNvjqF1oqrqXVx%``?HK{QTd}MFtgz(BE`k z{YQ9UAU;ZYB2LFl=fccqpdHUa2YLdXz)NV#SECa-fPR>Lk7no+I&jWEL;poF_22(h z=b}0{8e@ zaHhY*dn4Q5oPPtTL4`LOqYt!*yLb}X;VozYNp!#m;{8X_HD7=Rwi12* zEo_Wiu@xr%iJ$+i{|Phhh;}?34eU-dum_{_(E*pD=Y0kGq4RdE|18#j8|zQU`po}^ zjOD>Wg+T2Fv5rSbhr4#7eZIb?9dL4xPaXbj?qr?f#5r`Y)7oq94&&AMDHZ~^+sgQfom?34w^##@$8y0;X{m@yp);)*t%t68OEe?h&;k3Q zGrk^c;#73Nm(ZE7iRHI2wO26p{eL$XuE`rnw!1mj-w~Y`U4*uKAuTPLn#n3ET2rwBozcbEAZzBd)bYxN&bTakN@~V(Jv4JI z(11Fj9rue4K{GQddK21iW-Q;EIhmF^29HzWT0S2etV7psGnT@=(cjTPuDUEOwfjq> z0aZk2oF2=K(TOxe18R#7+yy;$1JKiRLy`*{PC|ddFdZ{+Enbhm<529IB`vi{H=r+^ zAJ8ulf1@2$%NneMu6ZML;1+2A?c@FK@qXV}P7dY5$VWw|MDIkuU_63$@Jg(I6FqJp zViWuv%~YPtLqDa^52fnpW}bw#@fq|B%04s`r;xyti9fmU)9M2HDVO((FklUI1`W^@ zH;wfz(OupV4P-D5#0hBokI_Bx89K4A(Fy#Bj&nAavt+X!=Pwr*&Y%$5K_&FVqXyQ( zmS_OCpdHUZJH8uj{}_5|7GpJBj}CY=-v1eG|2w+&nX-or-v;Sa*q|xe zK@TjCL!)yswF%Jx-b4r7gtq?#-4kEN@=s`gf1@+cl`8~N99`<_(Pp_g|5kL14Ti-V zlhLnAccU|T9?i^}Sl)=0C~reEcLojU58R50++pu*Lr=qB=<#lxCoM4-r(i$)H_3&^ zqt}(;fqT%DZ^Vvx5j}<-@`eFN;RBQ(#wW2@zO>Xgn)PTvzhW&cnm;Y|t+^AXQ=WrM zaV=KIZdawH{vvZS$%PS~!ugn9AT;<8uc7=amc(iWLqz^}2X=RarRw8Ri9I$|GOg@ZAzNLuQjR2YUeDZhmd{3F)ILPbO7 zI$;&cNvw=3u{7?-4Ez%rDAAx;TIx&eRJ8tWEbaOKmy5Dglqen|Z;nPd0u5*Zx^}10 zjw_Z(OZ^E+dz|Qf?15RYPD}k|l>X??3!AVlHYgdEGKrRVVlT{Jigup=F)3HQX!c!2h62QMXL^A~6ZaP+o(6Gb&OxE%k+@7J6!4L^s(^%)lPy(o%nx{5ZN4 ziSpsJRK}z;y_O48d?On9(>NOoR|u(l5>4$_*akCK3@@AxXojA`uJ}9l#+H@RQh!@^ zF?OTev~sxrF#4uEf<^E`WzN6v{DM_N%Io5+Onew&ed>=@4PQixr>7-uq}&o);97L^ zox|o>ty);yiP(km8#orzs)u7a9vx>odR!Nv?~x_dIsd*`UZlbdyoy=yF#4)JioUbY z#PX$hKYNX|#AfQRL|?^w(e_`UFQo6$_r@8_jTg`tRF0aV|Etk{%O$z+-Ch@6%l23b zhoKMLiC5r!H1cI=fX}0^-WBMJXAL^=yXe55#PUIOrpM4X;u&^Ec6FP%g(T6aD@-lQHN6^5}NBQ!YI#t=Q4)xa{fhQ9axiEFN zp{bmUuGRhMW_vl-pNamC&geY$#7uR;8E8PgF&)RDYrhEXZw@_p$LMDJ8lB-E z=qom7)3ElH(Isk!?ybS-z_-NuR?XWxA;pkYN zg+BKLy4zQvOZgf)v3Jo;w;RpCx1m0n_?e6RR9r-7oG&A!v}p9|Xc;sE70?XSK$oBq z`g~J#WSHKFCGq4nn#_o78n&Pix z{dx3w6>br}kTgUC8;4G45<27QvHo6kA`e>c`Cq_=Gg^**&0d2(_%WKo&(RJJqbdFc z%VXx2;hRro^v%`_Gw=~~BA=trokRov8(q4BtwM&<~eeNbSklC#{|30vgic>5Ezr&h%9{p^n)Ha-^KIr|CZIdC@GpR7; zcVi`-7aOiaGq5GrA4Jc4qFos1GIZ^WpzRu=Z_Z9=e>b3CK5vfY*ReL`jc7)GPIBR9 z$kIN%YI8>mU@7X0qbYBKQ?WgMf*;_=_&|s7ji`6Wu)7zbn|TMi%g>|F{};>II)#kn zL6Jy#QQh&|A z7`n9Gk$#ei30(Lwdm9?*ooMPFLifS~bS7)if!9a3pwI0^m*gvS=7+E{=Ij!ds6P5B z*b#ko-+)7KA(r+0pXb6CN3pJ zXQBf=jJ|@ON0(?_EN{c4H@@V;<8um4=|5-ynYxF8^Pn>=jCN24-6M6-Ok_mcpzS)L z0ro*>J`5da0vcEn9p|y`oPRr7Ooan3N6-74Xa~E{86S)uiS;MY_P?PSNc0FZ&4XsJ zEZT2Fv|Vd7gFVsyu8Z{}dT{>j;ASd(V0OIm5cD!NDBLp$1mX5s)E z@DJ#WPGjnr#`_o0iDVxXGL#2xR{-s=IOg~KSLDLAzXqLAx9D{?pgbntpNR(WC_2zG zbSBHA>(BwWpaXo2w%?C##_!So{y-;i#bD0A7X`VnqjG2fb3h>-)s|;b{Ab zv3^#pzaJfVVXS`+-5aZ8`AxLn5710}I+*kC1N*7aBj~X^g+}@>I@3HuLSTi^`m*Ru z8=wJRi$325oj`YV;6c&r(SFCG?Ps8S>+T`RQ1KuYMz#<=?=Qp#>tp@<=!3h^j=n$# zJb|fAh(3Q2{g}=%G`wm{qZw|9wrhj7>w!K$B*}#{x&hq-v(Sc*qnq(*G}W)6Dcgib zz7_3gck~;ypC9A>3uxxD3=8H$Cr|)=zGO66i3?{`3!Qn3Snd_eBhd$^p%KqUQ$H`( zKZ-uT1bzOMSicEvzay6S#quF^X?{fdNhW@Y4SvVeD-)f`mBT{^<8^dZJ4* z3=L>fte+msbJ6}DiuLo+Ogta!SECtQhnIQ&x5WlK(Y5~qoyq@ffImi0$NJyUnf(>Z zSw@7wazu-ufmMv<8fd>w(7@WG&v(Pr`5zQ-j6-L5GaA4hXv4X&{&Do(|7@&(5$$+w zEN?;s-ihv+&(Qw9MhE^8?e9#izc7OHZ=~5rh7{#PQ&R%%s5;tF9W~0WHM}))l?YBhv>kcpabqfA2@)X>mTC%ztN5_ zq5)qqDs09g=yPSzKr2P7qCfRkkM}#E&vi@2ieYE~qtSCeG3tFEd>H+HzY3k<4m6-c zXh*-J-|a3N9lk#lLuXtEoj?ZKZx^)vV066X#CS0cJx)n9wfCZH`!G7-5_D#3(2m!m zDf|dMZeO4Sok9orE0(j338$qHdcQ)nE;jT0x8Pz1H}1qn_#alq24ll-zpuwylow(Z z{21%uA85NOH-ul=^uYm?lUNeJMl7u^Y|AX{?NeZwe`HfgaE9(cU;Q6W{x>8}%RG9A0om zCx_o3cEF@-Jc$caJQJPKYV3lia0E7*5@xsz{c@W1mhi5>I$9H5^A@q(6WvQAu>#(R z?w$G3CFm)8_7={+7t5*e!(&yv@m?%{7|Z)(`Kws|34H~hMK|B2ct8Kt5J-7+x7SD8 zwTbqQjzGU%PoB#8H>LC9jaAXN(c|$kx@$j=^+(W|{(=U4Dc0wm76vL6t$_~EG?x2D zN1@N(f^O2eNiOVYIU4Z>^my%v)59M~Tz+d>>c430h;FL+=u+;% zI+$rjm`FWrN4W{Q*XCk-On%ITYn}hL@Tb_raTeuu*cI!}49D|s>`eI*`e5hV!ymyc zLqT+w(fDP^le>`>%wxRrP zH1q86=Xo8X^U#2HqcbahXBcQCHm1A`8{k)14fEa=GSUnUbTVdm{@>yvor=HE7fboO z!#N#@?txM0yZ%OW7f(lz*(`LI-x=>efG*+u=!?;H(XHs4^#J-t{T7RQ{(t4d4s*^4 z4X#Ajyb!tK?7)lexYcIw(Ej!szI@QBiinEG{C#!{ds7BOVLgJDyIJa?>k&H zr(zrW;1zSj%yXjy6hsFokEO6ax@r5y`(x2#I30cE&O--y4*iT+gQf8!G=O8V{@h&7 zzn@xH+!H!18Lfpr*b?15eb4|NMl4e&HNflKIfx$h0X&?tt! z$m-wArc0%e3IiF0zVoM`9X*P!)r)8VZ=(b5L|lgIFC;p&b^vKMYU{%}mSaOsq|L9eO-}L|^5#9|%i% zBRbKkXh3t&SATLo7k2zC8puYhjN8$Oe?|91mU&^*<%kx#swXWD@#{or67aSuFpG z&NTbOX^CgB2)=}Gqt6Y0BsdN8dH&~d;o3eOU4v^WZ^k-&d`@{Ze6e`>vG8Wg{CLR7 zF!b1tM%Qv2*2L-P3up!U#yc9zWu6FseP<9BrG6<^^Zak%!nHe&b+O3&@E+)bLn!w~ zUqtKB47`U$@N;yt{)B#rU9lh>vx?|3Y#$whzIbjymt-ay@N7)p%*8`oxCEINhQD;$ z0S8fDjlO7dE(&W}C|U*Wpb46}4zWBC-9uy0Juwwc`5ov4=EwU>(LJ|n5$E3yKBB_o zv>#o&L9eT=8T`Wnr{I1N43yERO@x_r&bzA~f}{VQbutK6llUFoCjYp!Lzf+M=6wAo@m} zlH|gU7oZQmi>7cV8qinh9yuB7$37K)9+-xH>^_dJ?WgDr_oJ!)8GZf_EQOaX4FQyo zHbVDMvNIPBJQ_WIQ_&Q?jm~@<+R-=Y13#e|$g(V09Bo$zz26Sq-NWPk+oMmQ?N*_C z;{#+fCKI1LrzdO1Q zUD7YnnIA_tlbn7s9Tt ziVoZveG~S>YWO&sfz8pKFL3@VP;r0?*X9Cd!5lA!4)R8eV-S>^%15vjR(UDB zx+kI^x6h%09!59q*{Z%4zFv>S>nSfqXO?MANNsa8lO55`+b4QGn%POAoJ>sP!Zo=YJp~KU zSLrJB6#R;I@HZC4tgok~zDSft_sVc|la4_*=hRrf6H}iBm_hvu=pH$Swky8YaXEjL zxNy@nM)$yUbl`ii3O-5U-3 z7WCN8z+_b}mT}=)eS#i~18Ag2(7?{15nn_D%(Fhsv^1KT8t5yz6{cQT=ogT2=y9Em zW@vFNzk%0L-npLh?*NtF3aM&<&bTAm!B{k)Bs#1|89?K`9OVNRsqk*i)PWUN0 zaM2Cnxw`1mHbN)dd;{m--Pnl=*Rm(N#zWAx93LCbi1+8j`;VfTScYa`4cdMy+VMU# zpu^}FnP1TUGi?k3nleaqA#Sju{;n{zyH613sW*Z-k6IHJRj}oWi&JEVtFgt zesA=<=r8DV7tjpl*&LoL7p;p1+zJh(&t}fQo9qTEd^b-)%d60i)}blhfe!c?8qi_% z*#3le_#67Zxa`BQ=0(x_4bV(A#oE|6*58kwqDMbWhE27Q3OjxsUGq(7>b9eSeSrp$ z>!Yv~#n5&Y(Iu&g4%8fdZUCCGv1ov|q7!-mZMO`o;#)~BZ1@AZJAcPi>b8VqSq|Ox zEzno#b?E&m=&865o8mL*aXW&35h=1Yd~fKDl_@VqPs2xOX1+rwl>G!34Y)YB_3=}) zi;@mb$hNRS+oNyWUg%`|M~9=69EYyX47A;yXjbn*_v?e`Mqi93_k~#hdaQpBeQpQ3 z>Yr|l+u>kr@I9KfpV99kmtw=l+e3$~usrqM(SfF6O}rC*xxImQ{3jZ4VniNhtNpR#_~C|!z(@x7Q+6NE1)mAJFq=&!mhUaBxIx? z8t4c#a}&{VrlA?WJIRIn=|OZuFGKgqo3Z>Ix{QCu`usb?wrGYv*B5Fi??uA;9eD$4xQx`)DKdfIWd#{5aUjg`4P4G&L8{HO#grq%J>t|7vu`<)Zb_P1gqf z!rTLg23RR2Uk7W(8x7H;+ZvroU-YFl63xi1=z#OkjuxTq zUW~pG>o=ooz8h`-RrDBUQ2rHtzV_$*4PVAjG~=Q!u17ok34QQybl@y|Lx+X28s)NB z3A>~1W}umwi?&~g{*GcL8py}!D`$Vae-xeQc})6_$+j;vD2;YlE7}ByP;QUz))i># z)}kqYJC-k^FS)Gy!=FWzMEmKEwjYG!&|y5`rKG_;G59Xuo2DJCiI*5cJ#Ru=*)jZCv+*vMJ+C} zei_!VA-1F39(~O}hRyJEOvk)mg$y;tUX**IdtxOz;FoA-zQ+vw2@Np)>(GB)bb_tX zfRa7q#bB&R#aQ%(@+elqm(T}3LnA(n)$tf+;8ov*pI>{UZ@wqdJ#`BG+)Dd4{EDCu zT5g18unUgx{NKcd5r2WE{5!Pa&(TbW!n?X4n%bUd3j3kYjYOZDh`x|+!y9oox=EWH z4)nU91I%v0!_tIT(4i3!*r{SeuX4e_$? z!)HMgY(x1rbWePU?w#!a3-#Tw4&{Y7jqwvZxfqQte+VDxtI*SM44v^gtbqTZuhP;- z!>(?IZmz*-yIIk@&{K6Un#rfo&yd&A=Xay;i=Q#|*TMgb6?u+@flHwcYNDBGj%K7i z`r_z|Zl1B|xu1d+@j>j3>(I@Z<9K-fD)bZ;M<-SlU9xMAbN(HuEfv1G`l01MNm{X@V}%Nc2T@1De@MNiIy`bhN`q(G)F0 zQ}{BvDPKo7%{p`mPND<<~NTP#QUC_1BTr$YN$Xkd-dnN7e9oQ%!!P3(YwVhe2kQ(EE)yc?NtGEwB` zaEwZ!0SrPTABkpWTC9Hr9e5G?0{Q?wR%g%&)H@yCj2Y;u=!-7JG;|_&p#eUEzBd+N z>YsyuCRVIMH_bXUfGw#8yqM5be~$)u22Jt#c>hB5@?SzA`Ot6hCD1+408M=-bWioh zYB&m0|2fzbT-f0Y(G}?0tj3AB7R^MNGa-O$(2iT8&-FuRItUGXY^=Wxo$(#9JQv+# z51{QI!_<$1%eZicub`=VJC?VjsXBnB_z1SaQ#cB1oelMi(9ArK2DA#zPrZ}fqov3?R7(6m^dgMLw&hX(LG+J0ShD>~2t zG~lCXX8u7laS6>>j^yv*Qz}22n!e}{6vNOx@HD33^VklTqaUAVuomX~BTS$b8sPQl zz&D`--4UG^>lelHOK1j@Z*bw8ZA-jyF#1FE44RRDqgl^|j`N}em58RJ?XE#H(FP5m zPjooi{>JF-*wFJoj|)?=6;08nXk>fQ8U286%3skAF2?#?e};C&(01wQL>i-O-Wh#v zIJ!g=(KqF6w4eEy%g_H8QWqSv=m)XEZuG%Jv3v&Y@FJGQ9OuIuu?BkHd!h9=qU|0- z-;7VA{p`cecnm9Ioxk|W-OvAlT=-pYA)2}`a04DkBYpbskfGJ+4A-Myu|CFD_&s`@ zD*O{RTMaaT*68N$fd+OHy2s|D0X>bWzYg+xtaulFaCa%BV&BZ&h;VF`Sb&!1vK#@0`cFSnE>Q zOry}Bc%DROasVCZ6gq*w(1Eh?_VD->LpNbXtce5Bapqw;OuooPX)ZpA4Sq&nFeNf& zPW>Vx1O4(i9xLO0=w^B&)*nPS@gG?hevj_<^XNENUKvioRp^9TUzrRk=|+VE z4#o_;30?EG=ou3ahg!RqJ?o1p>rMgw^iZMO)0ZaEsrS~P$Sv3_eb`8gNP z>=4@Vukl7&{_sF`b1KEuPoJ@QZ zE)xGkckfAbz~5r|LcE{ls&H;|qBClW&af4_%e$cgOh8Y^9cVufqx~*M&;4_;em|!E zIq1V&n7W_P-TGVfssf>d`e=t4cnfyL3b+;R@Mm9IbE_V+-%{~Vg~m1w)S z(2Q)t)L#eL&P5L@cA*`YEF2!Fik2H*9^A(Sy;G=o0)J&0j2L2u*22bl_&_@#}~ltK+{o3#$|lfv-T@y^B?Fe=J`@KQ#-L z2=}i=`{{*dVnj4KnF~{TCmQj*=t4Bo=g=9hM^pJ8di*{_JKBM!^dPzyzC-&timv$? zv|ZM#!vqST$vRzy2)9PNP4cmSHI>(LI!VFR3jcDNR= z$M?`VfvV2>m#I8I$F?_=$@-n73^B2D1?DcsKf$D{Hy1G|kWto5|># z@3mO|9$Qi_Q9jfULzm`p9Eu;J{gkZ``o9ic(#I=s{(bN}DvYdL#js{|(Y0!fspAyO z{bTtCbaPHeGcpg|Gf$xXyoR2t_t8zeAKi>!MbDz`FRzpgFOD*m!n?mIHsi)n9EQ)J z$1AOJ*knb~)VD=b+y@P0A{yvj=w5gfeQp^#k@e_v+hh5QSU!>D!sGQPrs03_Mxshs z^E~LAtT4KnYNKm?ZL}@=e2-{<%uIPGI`9ZIz+2Fa+=qT|ScblFlW%h2TK+FKxThlU%8$>>_%i*~#S4P-5v+K;g$evcljOx45Q$&W5Y5p*dkqW9~f{k4hZKB+S2 zZwwc%&2%*4d(h*!2;E#SpecU^?dUBu;E!YZTQsm=(C4z$2)6^h@ZgSQhu75B!b}bP0VhdxKCeiVj>J z4YX>kuZ^~Af-YTWG*f-h%nU^PO^)Qkj&DLAn2DxrUTm-ojeI5AZX-J27PR9}(2n-S z`$y0jUV7e#Huyxl#BqtAeS&4mOwz8{UNeF!>->#Z~B197K=N-&h~ZHV*d( zMCYQYEzm5yuxg<{sx?D1d|flnziW3d6|Vil=yT{Mc@^E& z8_|J2i0+FXkN%Ce&zTY4Y=yBr<#w@rBl_XB3|*4r=!@;ojAYoY1)7IVR0Q2@mC%&c zMmug5>$_o1$^&o^K7a;z5`86~jb20t%Gn~ElH$?w=tQfd_Zua-aDevc=IV_taUM3t z&(LF(qh(0lm1uy~(19DEd#5QHKz}sFqhtAQbV(jV2V9H)@9G?&X_t%2InR;X9H{ZO~)sOc|4?dTR%fgfRd_!m}y=}I|?`am7p@lXXU zfGTvU>DNHd&;JfE(P6s)mFSW2o$)8stq5D%*;y=OQYd*^DF570{$-(_@0zymWb6lZ zt4Bh0Xa;oa-Y#aMN;jM07}Pz!2=!6x9n?JwTgI{ThYFO+(C^3PDtxn%{R&O~Xb zIF(^(SP!a@B~S%!gt~=?%klh6amy6XP4NS&mC?&P_c9Sw<(Z*gILg?%HB^TNL!FtK zQ1^JTaTU}{@J6V3$DwZ7WvGokbTd)Ku_`!B1Z9{K>Xu}NYF#mtmxtPMZKzkyHc)oG zO+MDvbD&Q9dgEc!UxzB_1=NPzf6X9nMMsd%SRAS|4WJ5W3sq=0sHdVIQ~`r+JqhX- zO^5PZ2DOpRPzCRYI#U;*3VRE&bGv*hIW36_E22mQ_58PkO4JF;p$E(iN1J>X)XonW zFGCgZ3=V`}VJO(6va^BSQ1^T=RQwqpInVzbCORxjq3+!Vs2yyF+TjtX4qS$Mj_*L- z>xWP~d=2II&G;9}FH99j9}CLfA1Y5;sCYRfC%>y86FHPNgIZ95o5EVKBb382sKav} zYNvOhPV-x+7XO3oVf3obE8GCslJyjr1^$5PV7h9~A+7~I-~aE)L^~J^btp!`6mTI_ zAxCX}5vFDR1qMR@>du=~8JLarFsRP$fa=sys55iQi}aNpK%tMmM82R{+yhLLMH zKT0V9wIer_!z8FvI}a+s7AU`i&>vogvil5`I8;ri<>8<@8w2Vr`9pOw04h$Vnmqq< z%#WZLEDQBXXo4A@fhy!Gyau1aGH`D#M;@-W)3JC^c3Gg_T#7;++FB-W2X*-R!^$uS zR)kO7OyrQQj<0JOEDd|Z_fV(1bzMi_4{9fqpms7Jri4qOc5({p@w#s7&rlolsplk) z26gxXU?!Nw=x)M9_kJ?ep_&2pzPYh)9 z`aCcP>h$k{D(IN$uR!9vU3Zw|MDZL3z$6WPJ-;wi0+wJs3F^b-HK@b*2`bQEr~)H5 zbP~peIul8u(x*@{R*`apO(%C3qPpBNB2i37+P#vobb?<9HC2R;~-xjKa z{UD#D+^(@qbV^r2IbMV+|#LK#e=d-1!b4T)`g+sm4_;z z8Y~5y!*Kfizs3xyWDyY+W1*%nlpjsKFty5SWs5h5nP#wzwRajoAvr`J{mR5lB zuLaeCR>qF72EIYfgT;|2vUL-vThtNiDd_`q zz;jTaBSLp{I#d8EQ5C2{8$vw|t)N~f`gG*^*N&zl(2nLowR9;|A*-P7)h4Jja2$4p zH%woylVev6Dp5VCIIW@lI+=bL)ZrWlRlp3WysO+ybm+D~eegI9Wf-BelQ1^aEeL>W zT|t-vmWP>OXOl00+Tl8=LbgK{d;}`dRny;xx)m>=4x{@W6IJTd#Sz4TTBm_>EC{uu z(oik01e?OTPzm=!6?P0N;1#GHK8Gschpi)abvl*Em=faecBN;cigUmUuqf2K*(9ih z%b+^45vuaNCO-`IxSccoU8saFp$hp46*o#Z$3Fp-J^)Ie3wnP3UzSNa1hrrQ916AL zRZu(J2-S&QP=y?U+TjITKZ5#%^bV>M;krACVnaO*0Z@hJG?p-Zb?No|w_u_-ogPp- z4uVQN4{8U?VFtJbssoQq{sNw7{RQgn_Gl014E=_B3i9^!b&Z1EU~Bjr>LXl>UXJ|= z=q`-lK9kbWzqj*Pw1Jsf4}(E)D_jH1^l=h=h3Q#m@9R8vO`zWQgJB>%4;R4iP zIp6O;231(9{=T07)2v~Co_{5Jg+R}5!U0YvszAM8cY;~q6sXFNz%(%2K*v4{ROebj zb!a$L!p+79P+yot;V~};i@@fxgZ1DmHTO}n^x6fN!EQ~S$NRak%u}TVyi(twliUBxYzj9%_J>?D8rm@DCUMrG#zSZ z7ocvIJ((ZR8cy z=}$S{iJJ|obM4?LJ^%BW=#T|Ya0=K1buWKGy-TH;XuqBZTd+O=wWEMZzMg+mpg&y2 z`X;OihfVhN{H3+qP+x%Lo8o-^P!DR|3+jvn!x=t2e@B=oQG=<@j^;z1iK9?E$S}?M znQ$v8yX8-W$X`UN}kxKQsY{!nKq5Qfq7Uyq5N`zBB? zEbVPQPzJ0=!y|AaRDkL;9Q*n(GV4}QE$$BWf-@88d~#(8$*9p`jtx#v<1Jo;A*167M zZU^<)uCjHqdCrC!L*1&bZYDbIL!frN0jjlIp;~kpW`fs^;pRJUHo2f~S!G+du=PNw z4hF$MI2)?KBQO>G2ldr-ss+yH4tEhI64Zuz3GNP4!c|ZS&clN62~?+2EOfqLDG2ov zT@UJP41`KB90tJEP@TI3wV~Tkx9%m>8TkUa^={WcCVDPoE^-28g?bwDKp7T?Iz$zr z3TO;fXg?SmZiGs79IB8DP>HTXC4LOm$&XNHEzDwv@u27ZKOGY#$PHy!7Rs?9R3YtQ zN!SZ2z&_~f!xt*1zq-U}`2#5X7cdU|59&*|h)bPsM2>_iYz)-XFkNds|BFqq9%?6h zU?q4IriHPWIXf#1^;njIIy@C%S=a#T?5u$5*jlJW+o7JC!%zt?L2dLt^mGJz{yVrZ z%bgv>gi<7c+DS$z$2?FwFA4P+)q%Pdy`XO06qpQdg8C$M1;&SOp$ZAN!s&<~RJ^pX z1I)F8=U<0xDFP+f1(o0|RD#z~0mH6z0wy))fznrlI_({yI?@v=-Uz7Adb6QAu*T%O zp>E9us7^m$>2_NB0fAl+z8Zf*b>J^lOCzjuZh;?Eq6AR-v`~q1K()4{t!u-KtlK~x z${A3dnh*2A{ZL=<{BqkQ!D{DqAP>~z*9z+0Y#h{M_1NSQ);Q~oFemcrQ1^Z;RH8{x z1qIuB1yqODLlwLoYD0&ho*wrZGk65$_{#Xp3?i>}K5`|88PJ!9g<)S<0`7*o6+Y{n zTbKy?v(5x{1}a0HskTt99|!~BG>D(uwTFpXdL8NvJcp|6r^%zQcl7>H`pi&;7K5^@ z4%M-?PzfeNy(cV#vfl@FhAx`?71Uu3wLvd@Jbx*f=+G60+DSvG0DYiZJQ-$%C!lux z3##BE8=b>e1uAh%SQrj~>EJ%7!}kiR&>v8@DB33H7Q}&`zyIUUM27XDTGb9_hHj`s zxdG~MZGkHA7}U-lLcMfU{psvdwvy>jVoUUjcOpUqbo6gWBm2sMGG+?rbnW)Zr^< ztg)TvUpsGvK+kPQs8$ZO^(-j;dZ-regSz)upl-oalYg;wq#e$iQ$ko6eQu~j*axa( zK~V9QLA?-d-NEy(*ZM;U)S?SemA{5c@W~izr*kV}!cfTLz+5ms)V;0(RoDQS0#1O* z;U-uOUWGdKX?8icpt7-!n~4f&3iaCF8S3!$gt~_lOgOj3#w}&dIH&iD^KqVXx)sY!cEnNZCu|rU| z>@HLRpP@PsVUKgBGC-{>LOq6Ep$_?2$eH2uKNBTf0(CexK_%P+mGHQ&uS0d{k?{qT z{X64#D8Ep99lt10PfcPdyG&3U%>%Xb^3e15|C=&VYkNYSVmFk-FsQ;NK;7FpPyyFM z?Q}oX&aXhV{54d;KcW01?sGaA3+h%Rgo+mkRcKD=dH*lMMEAM^)DCMv1*j(j*aGSW zs*A}dntUeIEm{gy$Qr1f9fmqXH=$bo(ex4bJL_an_IaUO2344-HEp3P8vqqx6x2=^ zKoznTsuKsH3c3W-zzej4*DrBqi6jTBCq25OSKoy+mpktREYKLW@;x&ef*B0s)_kb#}??Ja?Fa&`Tje~NS z2IVjxs`6D(_jV^#r%plzx&!6+5UK;OpgQ#%s#D<)IqUdPw>Fin(?NAUmz#+mqsma7 zXlDk!Z9NRCkjW;W16BD7sKgs=z0=kQq2in}`E{s6cOUApduwu^!_L`pN3cnBD8sl= z9Y_VWlT1(rhKhV+EESDw}EPHcc=h^p#qPG@|y}3XP&KBLYPz4<_{c)%`m!RkS zfA^W_xqT0HD8d|bcANytFcVb5{I)I)6}X16Ih21ls9Q7|sw4BDIaVi2OnhoW+4C-EQfzls0o-S$)u7dXN5uX|G(fp%B{DsWAxK#idSv^RM-s6Ydt4()KLmIp)GuYvO4Ve3OscITi9 zd;nFz2dG2+$IYZDlc*=1om7De&;qIhouC|tKy_$}aV}J0E1+7w9%=*opk8Q>8_z=d zU51Kx531mgP=&a|o^lfUK_yBIRdEI=$3jp$E^GR##->o6>k4Jp%Qytee>_ye`A`LJ zG9HB5`2~od+x3u%TKC2gxV}Rb;(OY0^n<#`$)OVEgt9MU>k7864OLKcleaN>cc_jG zg6ixDsGU!Oo}d5EWuh0H%}^~p4VCB;RIBbnoz_oKE&giye^7-)JmbjYKy@l9)Q(d_ z?KG$9OFC-<6?g~g1?!{9!=H8Z zv7nwNf2epFp>9bYD8KU1`TM_2)PeR;6%T{j=`<+Ec~FI|G;V_`>@d`hu0wV1q45P& zC*DKF`36<6>zormvN7>Fo___(h(Ig~RdG$I0L`K9X?v(dU7+mxL3LuH$rnNux*96s zHk0qS^+~8Ra0zN7H=s89^c>H>TK5%!5=S}jBu)qwCRMh`&6b)RFRKzE@6KZA1o2(_cHPyt*QoyucC?I z=Y;Yv1XWO3s1DUMc>^fF)+X-(Idg7Te=QxB1EJ#OfZAAo7?u34l1%h`*MM@U165E9leaT@C#aqFg9C`^>2p8@ zC~WI$Q1`SU)EA{KjcuSl6}LD2Sf~PmpfwoF69jhWb{_Qdk=vG$y#|th+&d7yS$@1S8#Y zzI9v9&7?Sj=}=$M+=lw@)DM^vCcN!@zppTqV@uc(E`#!meaHEUW?iVCbnJ)O;cuvp zX1VKp3no8I#kw~v1?NG1EO$R+Qj151MMT}@TzU7fyrhk8{mkt193n!z!j(>>ppXr*yvIMz{ z<2{qf>>sBni;i@Nk%Z*MI6Ob8hJPf<)sO;uA!`=GrU>#?Ty?|p{IACNU5KEvd(V0t z)po&XD9*`9Qi+PoAX|q_V*&H7$Zsnc$#z;HEh+K}>-or|;4_+7eN6XV$KJ*%=4JKY zv9)B^e5cIwlj;2!7bNglimG9Weo(+K5=y*$T73M|P zz;^Z(ZnAkR{9iLKX|`X98<`xfS$DJ!Y#}yJx!W}lp&N(h80?~$WH1!Ud{CnSNfr>y zmjd2kH=Owz^er59>abZ z&9tO8l_+g@&vC^qw|7)PVzu@=~ia_DQ3xC99zlVB3T zejp1u+SxYw)Z-bd>46n-$ZVUl0gbZy8FdQ+YV_k~bRhW*t1uNt>l~G?3lQ%Sc?x;{%R-Fi5xg-iO>i8P+$G>iEplE%WI6N%56({J=gm_N3lS?Jgd?B{qqDUhNyMqBHXQ}AHsT`6ci zx~CM;2^O`s?}KgdKSq96Ns@LTcwZ9g{Vf4bxmY*Cz&pxQ(0=TyupJ+7W2l)|6!vsiUJD|YYoL{>?YP0uKwhRqr%AVDqibgc9CS1i?7l-_db*>}?oj|f$Ty-tscLFzIJ=J#G$P&xH2#K4s-bws86!n!& z$Eb_3Ms12XL-2+{9qz?-Z=r5K((vKXl@b$U zKc7+_qOU_rjgH8Z;&%#O=kkv9mM2~qx^jN;7=GfKYKB8dHr93? zo#2(3@4~qr2|r--$8_BZwt{LqVdEWPDefWHI|M86=@#_#ep2^OqSwT-7S~=fMxp#t zT=9{A#BvUEeQJGVZ74_^q9N1hLYB|Y)U^_Q0;)(!g&m2mF`1Z)vC&7NFYqAx2~aQ|1|LRU{9}gvyI;<_j4_nyC4K3}s0`J&BS0JGe(dTL2IZ()BfPcJS@HNH z=bKBeK$2=)@dIjuWiinJrK)ia0@lG^`(x zBpgPqnJ>b@AHxl_PU8xJH71czV=Z<=u>WC&mSx`AY&O9F{51l&)|tYH5p9F zdJ%T1@z0GirgcO<-qF+Iw8FkO^D6omVuzD_2-kjshGPdBEtqTEWe1-r<|hu}(LKXX zqc}-2kzfdkw$rs}1UrG=S-GbpkdgxAh|{*{Ik*G9oYJseLC0zn;vZD0lInQ(-^N$sHG8> zAyCc`Rc)vGvdBl_^o;qI5Q)o^=s3=K*|{J3kFW>p{sdjAsEj(;EJOa7WZNmIEdHU1 zcNCe%Jp7!&{r`pXj#aO(zt@oP7rUQML3ymG!mMZF{G02vRj&Zg2woj7B)CQ$uCwT` za0?oGBs@9T)UpknGdromk|)^nFNB$4g%HXOIHaR`@5qbsaso%TK%TcEl>PBJK(e#8 zGui*7=mr*R6NPuPQ`u@2OL{vK1hK;Rr90!uudK!dD( z;RsfdD+YmPb9J|Kve}aHvmwuT!k??Sri9qg2yC|M`LBuNBb4tDM4^~>6!4Y`t6*G# zMD1-S6DTGC-An8ekaQ68TU=qeM&W-2`@IyaZ#bMmwurbFm`AW;YM?ufO&feKqtjRs zk^BD}VKx#sv0WWy9Yi9HNdzj7@lj{#`LiFo=GYG>a4K|{v57};3{+O|Gz^A6| zXBM#@qHoLZNBh1^Rv-iQ^d|3j_TGUwTg-Qc?OSmok-HGgpgfF7*y?|Tj~3MArJs8v z9#M&q0!d+_AF*y+!K+V*DD$bJAQ%6Pzh_hqq1#F1N5siWA z`6Wcw9p+ct8NFF+95Kehw>iG&!qJ%B?BpH+>sWwHFazrZRGibQ&QF48B=(M@6x@UW zJA*d9@^gPA&33#Z<64k7mSvRmEb`UtG1(xn90lHIcSPNc? zwRhxXo{i)gEuQ4j@%_fypV(8F55o5?Er}h9S0jz%B+wX0!U)!d&~^jnTks+T)p&`` zIGjrmY>5>WXf|6}*Jl3Qo%d^j7m-0vXhU)^s{t!4ffv4h}%Xa1;)Z~qy z`++QQePpG*wJ^hw7bis*JP*@DjkT=n5Mhv&P?m_(u$yhZvYAh|J?QIkgVI~3xx{RZ zt#|PKPgg>=oP&Q<+qIem8j}#5#IP*N<^+u$!a@4%1dNS5Jl9eys3?1_gWo#*&SU=# zc~R`5Ft11Q3HVJ55vL5k{Db_i57whO`lhDF46bcBo+8*3+s!VFa+qO7c7BohYfCJj zpA>$~^jb$G;brVJ$`YqMMa3Yd#zVSN8rd1>f*rAar##C4AA%tm9)#ftFo7y-TM@m` zYdk>~2kJlF9!wE!EbwW3rl9-Dx-mY(Ng9@-e$mA#A&Tv8g@r@60DFyO#PaN)Z}Gd< z6-oY=>SSreO-_;w@tI(VM~J^e3$VMLT45Z*&L4d=EvU1$A->mkXyQk=$7 z<{G;RSP-A{%Fgh^zJ&rZCNrNdq8nxQn@PF?*$rEVA!koc*8a3(GDvI#umhEAEfLO^W^e6F>F^^$+WZMjz+dl07zB%V2 z;2w(kXuEjGdJ?*nIHj^%@(IVRbR-2f3E@t5QxTq`xZUh%0dsz`@8Y+ETq9X)Y+(MC z0y@I~9Xmp`;&HQ`@&8P?!eF@Gtm0A3U38^M){d(R0e4}O6;?*)9eXIWHrFr&XRs?l zqG}e?hjn{4u|DYHM?ZHAW{d0wM8v8u*(ze8af)qLgp-M04DWqxWfS(ktfQNc?CM}Y z7X3nWb7{+KD)~yRRK%LhwIIYcZ==_;nNtn_fGB|$BxyoQ1jwGoF*pwg*S)ago zGfr8M4aR9{h;0_+hG|5wdl5*C5o|jFwi;{g=3aM_xzfXx=o*txBZB?`_oPfhk+dL=_OtbUo|PCrF{89Fm}?>OR~WCua4E^Nlc)!5O#$s;F4o<-LXO7XN=*0$&Sl3V zRSYrt`Lru9@$QjtqS?BmvGeH&eG%-yAs%y$u>?2k*Enoh|KhU(dwv7KwVX?% zCO%=XONsppwwj)6ubsRld{vR+OB(lD*88z9O72VKS%vL*d05BO;$v6I@C zb#Kct5!(n(8(dqFZwygqpw$=$7NUhU$aR1`fyCM4__TEGL%@F?;u#M}UXJxpXX)~_ z0Je0sv_w(u9vma#5`5lR()A`U7orIH_6^GN)z2Ld?Km{2$)It|tToTZRfTI68TpU9 zJYx)73{S}mY4J~!{Uu`*{7+(+5dRx&OCyJ69EiPNh`7>ab#~$A|0>`EBi9peUmb<3 z8cvNZkR0-`&1MAT2l%dT=-!Yt1^R?g!;N0w64f|Pj5+A4a-F5nCD<=!J{a9<)+x~6 zVE$2m&D7rxOLcBQE9+%S9BO04|31S1PrXpvk5j;UWT~<3MY1pGt|QN`;*j4a zRzubrd99dX$ZnxuXB!(!!QHS;Nk@|FuX*)AaMRkq+MEU=FOKXBPNl7NGYQhuTH1xg z)7eo4uBphkSQmc58zdZSabg=)&~qz5^Z)QUhi#Kx7#t_aQiQ#%@p*;D&zNr^L|kl3Q_x8gWgy&p>tHq3h0tl}m+11t5?nEf zJB4eELOC1wH)X=YFgvBMv6zHNsS+gqO_s zaLqs$i|ZHH4+}RMeSLbMQ3bzmq-@LekZUP+UC|AMGf8uc7#fk-W)bxcc>;@bLtEAF ze8fYkQOS(^qe$h5T${{z5bI(DUdE+g!AVbWjpyilGGEKQ6uN56TXKD6t`U!<{2z6$ z{=E~iZv8dg(}w(_#o?p>`LQ>*+i#9w+NJiz-^fqAYc~O z8p&+~MX_B+0dbJW#Q&0QLN;}X{{f!}*uKVpryFBmsu_f$7Y?~_7=mF7jJ~29gyBkp zMW?79b|<4@H;Hu~u2K|o4PWp0j!j9kdrOR{`2K;@u<^lm8}U=&=N;~}w&+GRk0@l9 z1$#`@Em>;}gIZP%|2v1f&W1=MudmZZy`={be*_% zhvh-pfN>!U;%}wb$1o-3^UHazM=&f!#lT@c>ppC$A3lTexkLed;7z!O1j(_Djcs=9 zj#@+8vyO-SJAOTgtML;5#uW7}JP(RSBNETYunUUg7;PdzUmRjUjpoP?v)+g<1qtg? z%uIZ8ag{{Z9v&dzM%aeLF^Hw{1lb3CnqZ&H5xGv_e~?(;u>0fv(Zfz0E+Z^Q%hC|! zD?Ep@MrexYhi*NIHlg#5VAhq)rULWZ#7IlB3ncK4LdeGuD>MG7nTI0Q8P*y%v3HlJ zGL57JN`asgjD>73#u=&bKOE{K&j61jYfhWD!(a;OhD_r*NyBn!6vlTPy0hr25~~I= z-qHTe_-JGxR*2zt&7rch7*2;F$5H~$vY?sGS^78x%V9xc>sHuqq|3%SDYo~~7o*T6 z=64KvKI}44)Ef%&j^}!zjAOwfQ@|5z-3GG=z$pOPRx2((0n;#VO7LKU&BbmR>&09h zn17`>jc@2;TJm$m7+^`Ok}DM5*@S&zxWdiOkK%OAijZ>yjH@F%#qM{IC^9x0(P(WR zWSv>J;`&U2d<2?|?mIr0JyyJ2AdgGDk@&tv9t(K{3QElSFuG9I)#Ajn^UpmaPy#CQ zj+Hnh#Goq<`dwx3h|g|jQCtIbsR`H{pBmU|L_?>s1pPzXP#g;AicKAK>9PCbn0WrI z8Nn6Sl?21Z!5e*i;<_6VQzI@{fX%fIviK#5@ts%);UMbmg==SYSFkxpoqf4e$&fF{ z<|gX^u9eudWWAkDkDy+Stk_(kfn}h^G3*#lFFIiu-?QfZ4u@1$NM({PKt7laognB+ zoN_bI%w|uL_%`|yBwCJ4BN8?n?9P?37*VbBjqxo{>=^i!#7E=4_Z!clsY<_SyB5AA zcnzmISFp#7*Arv`=>8Gxv32IO*(5|Bon%+B=|Lf-S!?VgS!oirL-&MvC=y4-CNBCd z#F@u@Yknp_5cI&P9hK*1?T4|(Yp(6c{^FR1r1h~Y&b5HGM)=^tzTCmi#OZ1-D{!yI zIvBSHxLn}M%(aL{`JmJ2h+gBY1J_-erZI#V>#-@vJS+A$S&z54Wl4J#`6A+eL3Y99 z?ey`J|D@0}7Ft85;ryB!C(w)wraMjGB*^Zv{*MCE5+Du1wh=fA@_Sa40@X#XQJL$V z-C38#8H#S9$zJ38PQS>IkHo)7un|Q^l54c#`h!6gcJCdROxGXVSr)K1jc(p4QAj{V@_iCh)H2$@58SK#dg4_9`n_TrxV%qcF;dEH8npA$&bS}nW2zmg6 z@m67GD%5z7ZVdCNIBERGF%fnH;RvoAB&|izeC)QUC6(Pm;%O{J9)YVEHucFh3}1~P z;#JZYa+zq?BbNIuCsq ziql^s_<-+t@=RxQ1Cbr0m}L06R}xI)BG)h5`7mo^Qv%MRh$8G#qZt9?bKNnYk=V_* zd2E6|AW27LUG3}?!!I2%vfx_;-D}plNvx5WT;amH+Pd14pc+BGBgjf{jfAYn5Kv<- zPGt#r8rc!n(+RkkU~Q27Mz(}`$kButmyv6PG2SD_)ZmTb`HFn6-Jv9?KO(L`y+sL8 z2h;r2HWIESb$M&1!aN~lUl>SZQ(JE)F^^3NQ}L-voVMuaBKu?eliyBqy|SCppBy7} z-WL*}KLNwwT#+PaFs#8mJhEXV4@2?~mSiLBg{(Dp4YASK&h?xm<4Ag*pl7&?8ofxC z1>f=Le$vaG#Pg2k%!i}@tCystOtzxQg>faAksy@`HWn7OBr&M^T8ID&lo*>r_-e!_ z={{@*k*FZWg~qotm&OX~zzK@)i+&Dq`aq3BZmYH}iH_JVXW}^5l0~ut@)ERywQdK6 zUL|oh3b@aF1NNr~n3-57N%o%;+wcmS6K2j!>>2ku>xsYp|VBQk9Yoy4? z^$MSRrgJPPnewlZG7`3x(RU=)Ca&Jd&XQ-1wnyA}_}$=M9nsGw^*;C&!F`O@W7HeP zS=;+~IEMf)tfYg;mqJUDB%u|wghKr-MrUL>S=Yuk9Le6}pA`SrB+rDeMn4Kq zgZ*dLC-t`lW8x4%((6{ajAG~y5~ahq6Z%qIX$dym3j1elO2R-)^O7VdNk(I*@dDo- z#2jJk^VshoRugX00LR2to+8rd^`Zbl$`N1_itenNTJULRIDvIdj5Fe_F_Azytd#|k z{l+(r`7}UYf}PdF<{BG13cnFkV>WhSD9A?}!~Qe2?jtC>viJd4qS$F|J%__s=Izj( z$1xh0Mmn4Z*t`)wRUNS_C%#Fn!1?HBSvLnFD@XCCDXI|i)D+Or3Yw_jzR_rbfkq?@ z7LYU}*JKi%#&|BqfdnbeIwe8h5GW1nw3bYM&5+kezrl*nO1$OlJT$jtH@fD`Phr0d z{W-Id-_i*B?7&Dw(7#sIPDkYV^QG<7D~c7|CAv@CGMla52iEm9IY$p?; znqcz^-w%}V5!)tQeJq8{+fj~pED9ligMEHtP7T9fqkM#72SJt-bhKG7K=}eA4PSJA z*!U1!qk)pMpWGDsG0^u3+1UJo~vGVYfoRAk^P> zrOGPVd?-#DpIGOnD}^X>DZvxtsL_h#nF#QgfEvN*e=tuAA7b;v;taq?V+aKdM^_xy zr>JYl4`5SX-!9NNPC$K=FPC>$7&WHi%NC%w*>%OXI(AJ+{*?A=q@}>A$l~IgK6tVp z?+#JSd^3zks0D=C0CTXfi`1ZTg%D}1QGab;-7Wn<^rNu5#FdRSJ4_yv^=wkjxAB#uTB z;^e?*73;e6r5el)8E)5boC68s9nWxFVnIq_G#h<&instb5u_?fr_qSo1lh?v0l^zP z!Mq{(oWw^B?2{AsAwCDWS|Y1R+#D1>lz98eQ&``6&TlvRE5S4l+fHWU{DS#i3!Vq( z3nU9Ady-!;zfvAAz7n)`TI^@q{3A)8;Zq9xEEH4-Y811Wef3@4K9*RD^B8+aKXfli zdcZ3%jwJYE<^?QBJp%hs=x37Egb7HJk~npPo5bODbO7S4G$1+VDY%w0@4%%o0@Eb8 z&%{Qf6e+!9D`h36QMs{sZ6ywa$w<)~pLSgJDJ3yJm$54Y55kzlN`y@_O318VQjCMs zHWc+Ni4p`;ND~~=F`wzp2$Qnk$lRgT*1$^4gOH8j%79N{G53zj#BOiv`E0Be zaSxO0BtAM}t_IfBw-(gvcm}6Y=pN(n6UQgaw^8g{coW-{T&vJ|$7fGK?~2zP>!)z1th$$Ie=)xkB4~1R8l#p`^?uVOW?cl^jTH0``9#`Xj$|cZ zAG>|u*!dyWZLpn)Ur)L<7gB=CmMp37VLl_9BtSG#pcq zFd05)2tL7l3c`2zoI@WGc^6{DCqV@4p0f5)u@*B3|IFyJ=!Z+*;YXrM7Ca&&u_aH#%U8>j!43U)bHYYfRn~L@H;w>v1>@eM{H;?g=QyNWqjT<-%X)i(G|8FpY`6< z0%dH1q{2ZXE*1W^22aBIpe3BbJUhDV+_{?s*@L_%enqe?PT*|J-w~rcS2~JGgKaXd z|FG3qkH5xfWHl*Z6YD*}2NUu3(V9@HF$+Qz8TTmcYrB;*fVu}0E*Bhwdt}?^FgV(5 zCR-1t;h%`|+EC65Z1b_MhHg4^!T%`r2k8&7j1Ifve@TBWwk5&uQ$zrQJ1Ey!K&Gyh z6r)j@p!uo03)d*-8dWHIlz zEvh^PtjBQ~1}(HR9NJspzRbsCT#VxKq1%UZKXlaz)PZ$Wd{e;MA&Txm(dh_28{G=n zMZ3p733j8x9{hyPJASTdwEZDYBl9V(QA<~jGQDpN~ zp;Cz!<@u6SV870H8nvpt#M|L(plk+=%ak4z-a zL9Bze(+M5n!1#PrskCIO;2sL> zUf6G63*mcv_Pe>EjvUfqYb|r{T_|LRh7ebZWX;1EuR~G z7n_kkiEi&oRniiraRl1mqiDpFTS>SFc3=+Ni*DOvn1LtJZG9>}|1+9aH8hY5eXn55 zXQJD@BD&^Pu>dy1V%Qs9s`1FtO(rIjaML}EcC-K;(6gaJVkKTqeqHqA=pMBGakRnT zkOmWfMYC56n=L=uUM5z`(GYG! z2e=DM;4$>Q?A1g4yyyf=pa;G(TED5!vq*F$;TjJ_8=Q*{=$Yus=o@pYU6e2Bt9xS2 z*g+ z#ep?uGbwOY*P;z>MhEgaI=LADYU#6x_#@T@3q7muuIIZM*CTh zM(n*L3D3nYbf$aI5g);lShP-Bq7*hpucjf`5T8ODIDp;|zn~pgt{axFE;^A8=)n78 z6TB6@tyiNStTxP&jgHZ)WsS_^HcZL}XQAwL?gPUGXEep;d%`HBs~ z-8dON7dz3&>_sPd7+s1J$W4+=WHt;1{n5+z3G|Zv6bs>{jlx=&!ZPGLp%EH~Ms79s z$2ZW>=4l)TekB$rUkROYE4&&9$NUt`?}1&KO3(m0(vQ(A=W}#-@5C{97~5dCCgCG} z5%wYfFB9Kqs+V1l{r~kz3B>ddlh=%AZbo1>+XK*s+Gn$3+ ze9@BVdo`kM&`*#4Xa{rAj-QM9*U@9R89jBMVbTgmNVpk(MK9O$XajkhhuvKqJ?~Xx zzBQ&UU-bR)=-!xyo{9zNz&1p`#3JOsL)SjhB21)C3(mh4TT|d}?ialky(sR*Yj7bt zfOpWy>_TU9EP5J8l25b@&qtw=yBn+Hljw2$7;SeaI^myNCc_JVQ&5_M9IZmWO0+Q= zs?KNwgRv>z8uPEBYrFxC#D{3dyU>XIj7BukI`AZ=NJ!#p`3iD73?==<%70 zZpI~Ogr1GAL1*w0`oX*ddtre#VL-Q_^~a-;nt?`o9@_59=r@Su8zek7m$wZADTKaQ z0lk77#PW{l3+eE4_!fQdaP(9xKaaMP(LU6>6unpSMZ05O&;J|}?)K&A%-=va z+lMi~AH5e&p=)*q4SmiIq2q#Rz7#s(sxg0Uv=w?Px?yp=Bj%sLOX)xH775So`&a?b z`vA*!4Aw*&Xo{%_p#vI&Zp!iK0H&hv&qg=d+vvB#9kD#4Q|PBM`X%mWOd7&vB=n_N z;dONFe?&ug9$o8;I)@G~ixx(omqg#sLL*QEJ$4Pz53Ad-BEEut-Q9~`#Ra=?{=1T> z*(H2BO~W$ew_*)Eg&xamx`un8O>`u>>u00&zCt^^s9X57tc&Bx_eW2~*Vqm#bq}Ba z6R;Nf72P@iJxLs-;CigtBYdNujfUtbI^yCz(-NJqFWTWstb+%!G8Vipe1C2ky#>AL zoe2c*XUhViUB%PH4z(LKS}K4D@x(2K5M%$G+dnoQIt;bv=sHrzEj2)%H|ppm&39r-LYVvEqd z@&Y=6&v77rk3+C^-|!*zGJ4Z(M>lKPeqrEMF{kIhZYsfDj2^R2vBGWW@tJ^G_#(O_ z-^Aw!&;fmi4)FJwPxKE1&y7anYBVzC(4}jDzSkA=dj1E*2V>E5`yl!$^)$A^^=Joa zH-t6JjeeYFq7BzaXVw`FdGF{A=w2EUy%mk<1Tu6&yUXR;k__z*gypV5y0 zKnM088q#b7!=}3&-L%codiS91J%HAqhi>L2*bP5Jzp`Zx3iat(GI>tm+}m{#<_-sft8Hbh&D$Dn(R)(PqiWO!6bCV zGts4Z3Z3~XwBEaDN8g|`{tgZO+4%flwBdX=1xumNYoU9pVJvTrOo-2a60X@`H1y-p zy)XscBu}CPc{Y~6iVpCD`21URVBe$l&ZF<=92&m&7enjUN89g$4yYeq>iHi+!kLW0 zRL9XLF|`NKhSxhDO8+<1w|1 z(E-gvPs2;-ZeN3j@)R2Czt9=w7#2FrgSJ;3-5XhGy&7nwT3~VPgGs+iO(J23NvwpA zp~q)4+Q5fs2tP#|K7w|53XRMkSO>EW4-spCZr1kbz^_B=4L}EQ3%V5d4d?vZ;3KiZ zVl=-pR$Pl^$$y3p0)Hx`}X z1i|~CC7wKRU4i8P#lJLpaVRB z{mV1_S?he?SPr&r$(Pc zL;OMX3p8ST(MX;^+xrERCK7jqwaJ4m$X<;%;f=BUV{~AMkLkOBvCOMEaH?OyPLB`)jt!`{NIE0GCV%6DfcG#o^a<9}#7$&5+i#XRUHyb2xJb=V1SK-X#&X5!n} z8TVpotZ-KtNEdXI%|-{b1npos`u>{u{9SbOet`@mnJ92~Sb`$x3>%?WZA-MFDQGBX zqBEL@&h(8~z6pJAJ9;7QKs&zZp786seCWN>554Li!-}{SQ$PRzPU1QWvQG{-S$|B0 z6g@8U(FmWjYck=J(Y<$(XZ(h(GFXo^~a*^-ebAv|2`6aI<3Z5 zcoMr|wR^*6ydT|EPojI{1$0wxMlY0aa1j2D4xsOpFu=j+r{b9CG_;>Z=&xwL!K7=m zmxLqw9$mwq(7kXDdtt4q;m7A$=M3-BZ($~GL?e0NK|<}w&r;y|%{e{Hpd`AfDx%M;qcd)eS7CqjDxQR?V~0lax#;Rx zz9Hs6LIm+T|-YW*6$ zz`l$5KhS#FXNC@oqWSXZd&x#5e6eG+KRUx((1vEBBVB~P@FHg6I&>i4q3{2SZqmd< zArg7f=f%+H<hr%A31`?Ey*hiMYdIY4U|f8D7giuY1D)9#^upPU zHhdb5(4Xj%W}g+>xdJV}3N5dQMz9uE_Wa*S!jV1}A1p*W-f9K>46ERIY=K#`!#yzu zXOLfqMx@yzVb`}q+e@NLG9CSpT8IvO6?$*1!=w%GBjI5Vl-ke#QYoRnr}iQ`gweQ6n*~`I^gq7tl^XV}^JLc!05muR|O93f(K;#Qb3_P5wJHg1P2~#vmls>zE=euc+*(kHI@&I`LSp}Qxu3_Cd=Bp&`E=9Z(W8aVc7FGdkdp&`9hjbLjD0i@xw#^dK6cU(f-iJr$l`f#yq~ z&#T7rW@tOz(U0-rSlRPGB|dl++wtp-VI+It%S+ z0anA+SObq>78ZCWeEv7Xs-FMbNVuz?K|{3$o%v>T20PJEe}^^kRJ7!?p`+edit<~r z1kSb|60y%i%}p-ueYgV(#VPw_nvU*@%KMBs$@%*a|OTTWs}0xGEn-Bl0CS zz+>1QORNYX9*5>%K;JuugR$j{;g{DhqHF#mdTcXRhEvdJCFkD}cBjBKzZ+}g%hCT~ zb@D}C3RiSTY(ai9x)r<%T;42e$hL0@z! zZi@LS=;nGTmd`_9d;>j>@1h-lj_#cU(c|c8`W-!8=g?!9wkouj9V?K}nEq}{wh)cXN_4H)VKe+4Yhdly z!;+0amLi$Bn}j2rhBo|ItS~p`SD+zWh1PomU4l*MUfGTw-}E;^!v)ZMS+xGO=*`y> z{T|Q(jZ7E3%=6!mgfEOhH`hIAhwq^kKSp2Ng)Yq=wBaK$|5MDLMe8TlgaKZPZni7Y z`Xyt&GFq=Lrau2$kZ==qMMF6d4dF2K*xZTEU^bS=CovN@qYWKK2mBNI{%N$sf8z6t z-VFIXXoRmqPg@C0{rH z&;LwpgGcMEFo<<}0Qgj14k>qv~UZH!?(4EB6_#Zm3QX4{t)zJaAL}%PK z+6~>jeWN4Lh9}1SG<2X(q61it_VX6t~iLPns_`G&3Z;D2;BRbGN(P8oVo#<(riq@O=F6ZC1TtR`iqQ@)md*Rn_ zrO_{w_o4%wi+-9dM;ktY_3nSHce=tKhV$G7E0Ldq*Wqfk!|Wf0`pvKj`8(0`zZQ+iarC(Ufkxz?Sbp)=kS~DN zOI}05nN>wY(gfY*ZO|DGMk6v7-L(&(5t)g8I6WQn>(C|n9NlzB(FvVLm$2%`q1~D2 zK%Yn2PbR)0;qLwpZQwk*$*$NIMtT+6QF(MgO`~1Vfe%1uI2zs6ccU|(im5$-o{stG zz@I_)z*k~(}S3f|BKJRM+fj5y89EKgbwncU(rfp7Pds6kHsc< zAG+2bpppCo-4i*s6A90MBN8?|8jZkYbfk~R@)hV>twlH4hv+dnj)wYQ^u0o#hKN)| z2T&hvw?niq8p#py`BY5W(Hs(fPQQqba2pzd{b;@kVs5KEbxQ3;i8XvCqSAM(dzUHWcmn zmYAQ2zJD(|;Mvh7XuX%?^L3wd{w??@KG=bd@F4o)kI{e7W18cO@WrGC`d(-BT=zwH z^+V`;8_{;Q$NV02>3%>@S+ykOLl~RL8*^}$&W(^l>C;2KLege*Qox^5V|JlKsupIa2>j- z2BK>>2Hi9FqXSunnfMX9=09L_JRPmQD@UNumwSj`@Yr7tw*QLkI9addj{*`#Bk(pTX4M|6Yg%*>{Jv&x5{LJX#%H zvzGCBA9U@9VL6W#B>Vu74-b? zLL2%CZ^!K4h7e9d@AL=J87)9Vx(dC>Hbr-#A7Ur59$vIJM5-}5(Dvwr`tIfY`{8pN z1x@imG`|hKKn|lFoI)dV0c{}fzRYtT=vchEKdCFTns4EIGlG%_>LHC~8r(v9fm+=33^%b4GfZpt5H`5#!_^Phew z{L-lwdhG5-U%U@(@DX&)pFn4}939{*XoG9fC3z2hZwFS!gIEVII~=}7BiW9GwJV7Zuy(XQdc2yT18s-4+YMcUzGyqc z(E&`veDt4~7YklO8`u`}JJDnE8@9q?N5cSbLI-#^dRiXBj`$qf@o!iX|3>eRtN#}U zQX*O*S_6}gumK4}-!j?(omqGEd2e)+4T|N{(HYG`mu3+|5=lm`V zv=CZe8ZEDe)^GG(GCXKYferPH6>p9eZ$}4sFFND7@%b`L4Gi6EThIo7Mc4QodO_v- zKD1vPoj^tO*fv7@>zyRw3nS1qofMrB%jcsbUx8k^Yhr#E8i~VbM?atgJcqWE6PDR@fa4b~d=H3l8|G;{!uMCZllPoV=?gU)0N*2OQ; z_i~&Jn=mih@m1)Ol|!G`OUe0bM#9jwN0;LI=x}sq6VVPHLK|2Z%U_E5chG@Gtn34q62#l{dL`&=pNXC z*83i9=QOs)w4cIhX^ZyL8Lf96CjHpGF+P}%j_{G_0<^>D@P2$1{SsR1=MciW=$bc0 zFPh%5ydSz(ZbI*o+hTqkI1>j`WS_dbGhU=n{R3*54n? zzmNIfV*Xq-`>D`j9`wCT?1WX(_mihM|Bh$|1%`TltoUNgzm0t;|0I@|{w4e!UoEU* zeXNL|q950Pp$+HxHH5qfcp$n|L(!$X1#NgDHpU0hW4RSQ#);pep8ujG+@*Wb2Cg|1DpW>i z(iGj@UC@q)pdH+S9=oa71m~ka@qCNcFL*XB@fcRX3AhoRd96P}yG=0l_kW#9ID;F} zkPk-(@+kVLwiu1XdbH!MXa`@T^-f@AJd0JZ)Sscf9_WDkqV0@Ccl`{soyW1M=l^LE zRy>M^_%wP0p2zZ-=daLUeRLBwLqjyZp^|5usFVs&2a~|!h(N?d!s+5 z{{C+g31>JBZD0<%wu{k$J&O+Pb+qG+=)Lg)I)Ib0{484k-*l#@W$^YoG&bhz__-vM~62 z9kiVfkO3zX+evuNzYPV6E>Ii&vuqE`{#$O6bh`U|D1UpDp88@@8g1zM=m2yt+=O;~E84-h z`23#u{Jxlf7#;ZI(Wj%YpvQJ2`hIdxd~g`uOsB9R{)>jH{w1NI4%n1@A9R;5#_ISf z`o-k}8i|5A!oaUVKg7zRpMDL|4*Q}L7>qS3j+DquB?vBN5toou{6&gj=p{w=id(ZP~ZR#qaB_^8~g*E zQMTM6UkL56G&=KoXe8R8YuzV0GJ1D>J}c&*Lcc-1iVpOP+?;1NK0lkOyJpWe~3omrX4m=o#qpg75uzKc)kI>DRWg!Pkr?& zhu-orSJu%O(o9%trU!=pcx)SH(!a$VfS8-uI(c1gokiAR<06` z<$ScGW$1Bz54}gWqW8*IXav4Rui~6l<5xTM$}U=!^Y7JLkpe5!#x2+Yy^8-spQl#~ z7tm$s#ZeS$GKs)N4Y4sEy#`k^!sUCMEoiL=o9uiz!PB}u}Oe}Xpf1$y;aii34cTPM)6ux=0lIniqkHBUx@0HNf&Gr|oeSvcxV(PoxEMO1 zD(LeDXv90z=luKP4HVeW2=wRsJJ1oY#=r4hbb#v{gpj|FzPAk>*w;82f5vni)i69C z9lb01U~~@J-ct=Z|6VXFC~&4fp)Ha|@ za7oipUKqWYDxfoNgx&+KqV0moL?;qPpc@*2zG#SVLK_%?&TKLonHkZA(U-6ap8uRJLWqlCY4TOD0`^32wtKM&ZbX;rU$o-_ zEyI9Iqf6HejZklN35R1zycd0M8M;&((GQ_dFzMPJAmL^?jW+xr+EDIRAzvJ=R|U&q z3$%k<(3#zjzPAJ&$SSn{`(23SY z+i!uFc>X()u;E^4hXc?KMxdK%B6_SIN7rrz+R+B|3jP9Jq9ZYXI-0FpI6Vc?2$Vqw zPzfDyeN3iCLc#_*p_^m?8i`TSv1q*s=m4jpGoOVHU;#R?m(Y$jq3wK#cDMt*fDWVY z|AkICqdVu{M6T}PK|b__VrT@i(3#dp*Ss^@@DQ}#7<48{w4Ld({89A%rD*+Cv3xyR z|6_E5Uv=mF`{M5S;1D{K3@ZvxewJ)iZh%8qskvKP~3x zqV2zc4s3mrgloGMZSVj(voq+-(|d-^R1n=vHPA?OMVDYGI)Slh!;{eWW})pogARB# z+To^Hz8zDM`!*(yq7D6sj{JA@g>2V_8RkJZV|ldUX6OLAp!NEp5gU$1>~{3ia&j!c zFP6`W`T5BE$;7iHY~YnxVMBP3_$ayqZRj96!2h8G{1F|<`IyhyD-5V8x(Umo1F4Kg zq#hc%j_AN|Ov(AXm4pMB6dybo^K;M+pGF&8fi}1r9ng9-w42dTevS@kHyWw$(D(j} zUer5mx=Yb|c`^0-|IAoW4(*^eI?|@-#d94x;y!4IhsNi(VLS2D!qo5o8k2CQz0qAf5DoEdcnwZLXSfV)U{%b&jdt`N8i|k50q%|- zK_mMkI)J~>_cQv0{N;T(|E^6D3Y>9ev_f=wXh*}*fs95QoPdV-K6C&x(WO}s zpD&HRh_<%|o!A!i;@Z)N^Y4RW6xi`^=nVdiUfeg7=ZRj89<%c3z#E_g>4FZdFFKGR z@%ioO#2!TNiN)yNSc69Tvm^-vAL{CR1`n()EliFy6>ZA3VqI;nYx;MI` zYkxC3p}V8g>zSGtmLoj5b5t z>4FYm0Q%lYG}03=_4EJK_+U2r!XosAm9hLSwBz?<`RC}&_s0BTwBeu7Nc@e~PYev^ zLXTZRbf9I?iPj$&fBtVCA9O}%Iv5?{Ftnku=z#7)JDw4J1a0_9wEl8*bG;h#Z=(Zy zA3g71#^*<4`HusW;l;lwu%Yxpp~HM=hsDqaDxe?Jbz|4F3o)N#a9EoBXgfvF4vJ&y z#zZ610DZp;GVx@hF9~OKV|*|Io#{BVp~>i)--k9Z1C7uUbO~0*{JNO`5bby;8rcI_ z1&?7>%s(XjsMZp*`}6+<5;l}X*JKttpvAF#StEFQM;kNRse}#og!(&!7X!F)TDx9KCR=qF*3dqca|W&R`VU@FcY3nP`WL zqR*idcnOW{8gywlp#3Gcl5l4G(T0zrA^ZgmVfygUQ9-nWQZZi(JuS^+zFTx4Hm3Ym zoP@7nJuE*WJ@xlMgRutrN3fdb|9uh_C^(C?Fmq(6cpa7_KNb7nOIRGUj|veggV&R9 zfL(De4#MMD7u($u{=MKnY)yUxHo=TrL&RI8HiS>D$gG$OsQ zJWfSJ{W5w?H$*q%urxm1(2!@{5pKFsSdsi~^kinqmr zak0X5G$OOm)9@NPkgaG#`_P%4LI?6s^r8tNe+9a`i=wBiYAo*`ekOWsYoP74Lr>QY=qVZ*^LHmn*ue~3 zflr`&qT!_QPpt1?2lBb^3iie3aIM4~eV$FUXGy+1UN#7^WlVn@vNK-j(4qxGN1ws;mj zUX7>4zl^|^N=uNm2Gw@ry1P`D~^gX)ienZ#t z-(0bo4F+VV|Y0%j?K{aZbaJ~itdron9H@E8XwF?2QUxw;1cxQuSPrE6!Y8B zyL@l-2zp$Pqn`m%5jre@Mx+?p{t$E`BQW*f|GkrhyZJ#Zhl|k}e2DJeL+FRk z@3B1B%rJw}=q|5|6|gf}e^M-;9ep1CRqaN!pMB^rAby?6`FCWw9tsV1MUTf2Gy>x= zH88Z{#puW8t7rqCqM`f&eeWMEfw>+I9aci0cR-&HKqqn=+TQes+1)m@m;xJKi*~pZ zo!N0T5*M%xUO6k|n?(Dd4c&qMTt6Khz%yuv@1qykE_4Y`Vs-ozZNEZtcKGM>rf5UA zqc1#&{sY4jY>fM{7GCv8_;BimKA(-A|Ig61{~GP+f6-sjf&GiFeZfb=Z_}?rBav)R z!d*KU-4w&n<8cR0!pSlJcQoU%@Zx3Yd!^CSQ33D3T38!bVl_O1-V6C256871+VOJi z<>&t<5_VW{P6$aRdL`FEk55k=g5$6h?nRgA0`A8APoyUf;ZJD!r%#3sj-V0!8{Gq! z%?)Ov@72Km{QY?%*Sz%9|MRHf^V3uRUmU+iL)Cmi7+700q}|aQaUeRQXVDAhNA$*P zx-eYLlhJ{{ht@xeUSOpbg(Vw{PWUyvk^U1KNVtZ@7KdG52HgX7(aqEeZSc03e-u3( zuSY*XFP3l6h7Y0V{{*^(f1#flw=W43T#L7oFTIrW?+Z_ma1ED6Uqs8-pr>OKdck}f zJ%R3(ztPQg(Np35VraS1&whVdTeq$9oDi4+Hn3OYqcgn={hXhPzW)Nc7uKQ2_p_M)0llcsqkE$4Gs#fl+GoOp9_T%gj4ndY z{aSPl527>7dN$0U30l7wx@5Pb6PkfpxC~3;S7?W4(TQC0T&Q0pN#a2Ys$y!y=vDa{ zUW-4WOHp=N*aOwj(04@#(jUE0#-JT6i>^fn@(KD`@f~v95 z!X}!7&TJ{V_OGKIyoa8W{WuVh#eB;ZVa+?D@7)j`i$-KxbV2lGG$Na^mY@G0k*G(( zd9;JtFNO+@a3cAZXvj9Br(_#iZx?z4?nkfQBWQ=epfgWj8NSfuM)yWfG%_QjV=%Yp ze>@3CJ`Ek&Li9X86Z0#vCHdFTbNnZ|MDtP`6&^`4S*1+xP^9$%Ptp7&%d*C@q5)CQXgLSdsn)K9v)44O=LjGGEgstBU zYyToTke_j!#^E4Lx~UT^fnYIO8L^ooB9 z-P~(1_4EIaBqmW%_}%oxJvav|W1cPPiMy}~I-rf{06&R-9X*W2DgO}*V6OMVFCI!@ zYw|GhGZ$q!vFVOPc(eKgFokc^Q^TY7dZF%(Gn2g?> zE7A8~L)ZH4nEwRbJ3G(_975aw`NL$`z2{?vOFjw}3ZOGBiO#e(`a)-P32s0?oQ9(z zpNMww2s(hp(PikwUPj-49lZy(U^o0XNx~PpYz-auMqe0-Rd5Ur!)I_T=KMGuzk4vX zS<&78IJyMO&`q}iJ!U)6kM;7~!t>VXg?9rQiR3U6&h$>Sp&4kyi_nlSM>op`bOv9< z{6XwW{xmkg7N3Ot6tvz>yd96C_rrDD!|}WkU8?25WMUNwL%0U*@ROK76g?Zw^=TM! z2~2$_L^n}m^!{{=``u`*h*8D?T1^o6_7 z-TWlFSC*q4zJktZ13Iwn=l~9)?fs4}#l>HQh!jNgrO@iO#y6^;4oXegURJEI-kfYuw0gr- zk%TW6K$oBdx|u3tEo_dyFcEDyiRE!7`raD67T?7dcrKPV*&Sxw0o}Cy(Ma8f?v*9j z#?SwKBwU+Pd%{{bK||FE?RWq>gPWq`q7PsX%AdqWcoMx4%YPe|<}UR8uh3(=8y)Z= zbU;61>hJ&lBjItmcyE|_aV$%|CZ=vSbbw>gFO{>=P4+SR-XZiR{1g46l7C-#uMWBi zJEHf}7$P?2Am`tay-I*T7EX>!YEai7w?_bg#S`%m0Vo6ThGX_yavP*}qG@$G`uR@Oa#eZj#Yh z0UwFw>tp$Q=uD2H1N#|Wg0%0$vAY~y(?K{CN1&1X3M=7Z?2oyB2;Uh;VOP)pd=jqR zNwkA==pM*^Jk0D$w4u^yBx<6YYdRY0S?C0wkIz?OYG5Zqh%ZN%ss!486Ewo@G4rJ921q0%PC$Kg7XRsxnz*bo0Wcaz@PIT>_$3D0gU5dOvhEp;K4fV~~3&*1!e}N8o zFFN7VnDjx$Pw{wQS@K2DwQPoNx_;;jv(U9%iuLe$Y>$V~`=H{_;a^DaN8kSe-Mne1 zf<@5s8kmJ0PjUXIk(fk*n=9>?5Sm=*jaE2X3k`iYH1x~SP4^NS`nBjpHe*}-1bbrs zU&E;yfwun!X5u^80T2Gl`7cSL;%{N|bVf(m8&g*GVVs+>JA^@b6)X zp2eo*kD~*qa3<{XJJ9pK4LjpiXT!gWjY2=P)+R|TByk!i;H*Ew*XitkhE3QU4f%Cg z2K%FT{Qc-Rn-|bi^C7xPzeDSvL67x0^s^$*Ut#9uumt(G=q62$B;kt_W5IMZv~y$r zS@i0C72P~B%c@tAO)&!Ypm z;-B~_h*qqLZoUp^1O20;(PKI#=AS^1+45NaA$kh-pzj|?Pt)J%fEu5(ob%tFgbnpW z&*f;e!riF~oO3jk3((Ji)o8sB(0X4*51<{MKqvAy8mUXphtQWsH)$($iMnFy?|*xf zaMKNp6(*sfeIVv%qq}|qHo&E5WcHy0{~bMM+5Zh8FOJqPk4CIAdaRqE?G8h~OOC;$ zYx^b%XR-lZv#sb%zKZ2XV)@V5nDRfdBG&mY)E|s~1G)u0jxVF3UW2XiAG{u$T?qHY zVq8c5?1lLK{}uj$)Z_Ce8k#@R0sM!CJa<|~s^OAYjeJFHkNwee{306KKhTJzrDr5O z*7?z;s*6srC0eg5xX=;}ZH%c8Cv<=#&B;ib7#0-2J?ckl5{}3mU--cdDEwY7%2BN!tIJ$(> z(SgiH*L)#5z?b9m*J6Gx8sUv-{p9;3ya>KPUp#=$_?Kwnq7bq?=s>T+j+lja;-vWe zH+10V(T=la524S2zE=?KunhXVIuem&q7Df|*8~l54|I1AM_-&0^N&SeL@%5zX#GQI zNY9|B;NpujQopp$M9W*Dk-8pT^9ksC4`NZz|6&rJ({*SlzeYF7KD49nV|lhq!VGev zr=%eIUM4!=hG@e*(feXV%-@Se$UlkB{8hC5H_g+3;$0FRpAX}MY&kL#&B$Ml?ul-g zj@MxiydE9cD_9*rjrj}cQeK@iM6Mz__DTgLJ(xiXTeAHVxi;PH484bf6`0MDVD z@lCXWkI(_`jL(lme@E+GbZMAKL3By7(Dz!P?R7;bJQ!_f{H2_KNBTf~@MNs`B3iy7 z=C`8_9f+R9a^(L+FPhBD!scs%emwU_>)(sDa27g%_pt+hjb-qfWbSa2wZ&ExJc+)z zA3wtr=!HPg_IvbPSH2=6^;uF2t=AbVU?0rF2hb&X9gR?O6A3%` z2Hm~K(NO*yE9A}-@@3F^b)s$2`?AAKyXF)4;2Gh}*%|Z9ZLbRc$(1u<`Be4#>vOh#;wjcdeJ%dgxcfPRpCDD8x zO#ScwI*_p90Ca{EV}*yJPsitPqF3-2SQCFlFPzN$8L3aVdRT@09CS0kk8ZM0qkGYa z9Y+Un4paa8-zy4)5M`nlMOE~3zCAX?>3A)E6iq9bk!V7`0XpM*&~yF-I)Ue+Z({1> z9Q`={3R_^ILgC`-he>zgL=x`er?DD-fTi#ctb|1ihc#}C<;jo0()a`x$Mv`X_r~XU zTp2doQuNE_cFe?|(TU_Pl9Boz(Y6TZzaj-QC~zQe;?1}pEpJgY4CFTSxIKyOaT9jH zoL7bVy|4}W&DaAkxjLMR{^-T_Ja)qk*c)>f3w!S7Vx0dz6fB`&2>ykWv48Q<;C^(? zOJ`;z24hon&7a4rxC!gxFX*N%S0XIg2&_YX1vbaS=)g-|6ZXb!nA&Se67J@Q(6wKT zj(9D4Y(9$~K-cnT%!PlVn=7Ma*!_9XB`b#3YmV-Tj_8Hd4}C9*w);>txhOt(2|aFW zqwk@|>od%TU!x7|MUU(EcmS^|752zKXvgJBhhtV9UHewiVdxUfMEA-8?8AS5GBLhP z_>|jGHk{jU&|`8cnpQ5%AV0d<>Y#UcFZ7&`L^tn!=uP(mdMb8APoR-aln)arijB!; zV(Rbz29j_IhM^&wh|O?1j=}BN7aLXx9WOv(3O#S_Te-bt{5*^4?w1au*3ooKK+IqC!`{+RTq67LhKEHszcS)rXfgGVp*|YgR_L1cMrY6u z?Pz#(Ec&JNE_A8pqvw4!T7NUTB%h-1C3liAg!^$69zkc^sd{*!51PLjJzlqCcU&5u zpGF6C0c|j&M(|R!yZ{>6E72t>j$T~Vk;o+zO-T4@cRPAzzKR|2I2x*2HN%Td&?V@O zmfwiZ>=raK_h3nUBtCxw-OQWN0qjI4@-5oVcUZ{p|7S?}`G0Axu&c|U7fXYf?-BDO z(2!0=KLZw^o9%Tpr0=60e1gvK8#Ls{&;kDzpPxqueo1Wx?)fiF!q8MeA2jpm< z03Gpotcug{30#YAst$F+nh!)b?>*>1pF)@Htyq2pZ6~8{Xg@Ee{{FWViBzc33Qf>~ zbVdg<0NveV(7kdO8q#~wV>u0dZ#Ei88bO7(6OS26f=w5U{htY}si1vH#TF$>C zzodScX(4pP6WAIyc?f?jTOlsN9*Np7b0G@9p~Q>b*I3O%@OEsosM?66bo&P+I%&-qq;R)kn|!VDz{SM?*geeQyRD`bF{iOYJ%T7Ho_UK8+Rk$NVXD zY5qeS%-$gktPr}ns>FO7^ka7*y7}%w_rRk#3YVY*&e<`XmNMwEADJZKrWqRxCZi2J zfDUXv+VKi>25+Mg+m6ocD0(&jhPHDKeedE<;k`oW(w4(Acs=_3UaXGEM@jfI+570H z)_>>#F6|sbUmSh01{#Sz=y|^poxuy}rhO$oe;wV7>(PO~kLkDzhvIH5hmE?Ve$q-N zZYFUP1>a*m?9es*v^ovzlm8UG+b`*sk@`E~mgtODV_!Usu6cv*p~GhAK)a(8>Wj{J zI2y5u=+6Vwv6$!oxm1D=4K##Dus8mUy|7h}Fw>=I=$}WAu1L2tI?2dLTB^^I^aX-0DeSgeg-{; z=h1ovuL}b%gT7x4J!Q=>=`rg~!kOKM?$QU*by+Xr<(Y;a*jY$1y zD|AnEMK7YBG2aIb{SD|qCidd|yQ^nXpo`Hpdj*~OM)ZXv=q^7W&E7lIy8<0xF?3+H z(Ft@!uk_)Vi4Vu;tI)mk0eZ!s?alc&)OD{9q3?;#bUfC?r?4XK!dl3G`aJc8qc+wd zJ30CmdP+`V78dB6k=TdL&`=la7ba2@Gs$;G`@Jnm!Zn|T9*foJ%=cg${1=^BtNvl8 z{m~c4p)-6OyW*Q@y^C)M7DIoYsD+u>1HG`up-Vd({ZLE3Ou|pKPq8}|84w!06%FmX z=q}!a&g2JlN&dx5EIcrN3Zet*hE8N0mc*r49^XT+@}JNNCI+Q`@Ztae8wq!DKXexl zL-)WK{C{2N0AAU;we2>wZQHh;)NRt#T(xc6wr$(C?cMIS|NX3YtncLe&pGqD zX74%29Db2BX%huGHJ|v%+}8PATLbK zzAV(Myd!K1mqR5Iu8qCo=H%(F~M;UCN52}JvP?w^r zv5B!G)V1zw`>{~=bD*B4RZ!P@8Y7)veN$sMsDPuP0!=Y4fvRu|RKVS~KLzFIB2?m!jPIcm`4{S* zirR(eUm0cW;wTn@a#Ru4gbko7TnE+qJy5N`2=!dQhSE>f)hQsSu{>1Zrf?tZ07Ju! z-JC+QKwYZ5-FW`>qN!pBHJ}_egnC7`gSsSvChrB+i4k@_(axtqUDE|n9a&@C4AqHU z#?w&#?m%7IXKog9_|Xo2LK*mWcUm0>YM&bV!#q%T^=zmL7eif=4N!?6fO>q-!y)iB zRHZ>Zd_4age>lv+{uj&w-C24%@9@S@4hKQKsm4QnqA(Svg`1%Q--h}){}`5nVS71m z(2B4S`yNn_=@zI8Uqbo&V*8&^iH7OzDa`GP%|h2UHPqc(0LoDnSOSiQdhwit>cl4~ zeV;xK<3rt4nW6NGn!F{{rR@pT^1e_v`7o%2=0MNS|5?OB*KQ@0qph$CJPs?sxP6^V z)Eug{?ch^54AzAm`Z+i05vb?;5|p3UP>KGwea!yOrAh_W*<7$HpMSV&XaN^N8GM4< zU^s5hxo{uUQ_yID)4Fz0mGpwDY&_H@nrY_;VQTglpze)tPzi+{=p+~)>Jns!?(8gz zvB(93p|06-s5jy!sE_lfO#TWg@K;z3MjGTeYy@?0bc3?%2jy?7$xp$|>@Pvx?5@F1 z$0H2p`B#8A2z2x1hWZSs1k3~n!s>7xtPEX4oL6oYDE%O)_eVdd#3w*?YBp3ND@}e7 z>fSj6v%$Mi_ECq@S{Wu9>Qt5n%0VHhOe;XOt|rt?69A>(9?D^NsK;wK)cax{)SGQF zRErNl-CO6O3c3v|!tleK_e3o>3%$u2LRB&aD&TUcmhOZ~mpgNi!DsXwIglfa|Fc^C7eyFFzy@-V}UuJ^UPzkIz9)!BdE<-}pOTnDTYe2nPhe6%d zW1%XX3-#EogzC^C+h2r!>|a6IMH=Pk$AqcaCxuz{`F}|kxe;`Ms%$0919w5S?juy@ zQAaziiwjjjVyJ-Wp%Tgm)v0n&ernjhB~$_(p*qtQsvx&WeAi|c+2C`iH(2~J&NVLt zWl$PcgVkV9xDe`ZMhV9{j&j3h?At;GJ_VKdZCDomfa+ASan2>HWNZ%Is;oPU(y%{N z1xKLd=b$RRW_)b?0Cm&-hSHBT-nnPuz^v@kLUp7rl%Lj6oeG4yXZjl_kLUT9;tB-G z;SQ)b*Da{K)HT6z5EjZoRHzD*K;7k8?7Rw8g>`J-0!qIflzuOm7LKy>O;Gx~Ch+_# z!(#|^*PnxB;R9F+rkm(oif&MP{h=xt237fNJ6{U*SgwQW%pu!ffVzZFjPIfBe?lb~ z%{|F!RZ=KH7AQxBp`P#RcHSQ9jn)V1eKFa12CBj^lbwX(LM7@4B~J(S{>TsIzXa6H zSRJYWcRd!$xCKSIf$=}w~Uq384ewJem`0jSoUfok;?=m+0GwJgdEhq0k5O9T}lIh1|| zsE-9DpgL3^>e^p3K7@MHzJc=h5qkdr-wzgQS&W%ZWyztgT}CJeg`galg{q(ll>S_( z565ev-Uo-FT6+)b4fhsihcRb4`lX-(*MjO;L+JVW|7}<(P(P>-3L~I8F$OB|6sQVU zLj^o+`K4U?>;hI8Sg1%6X)lewASy1|mpgyXuhw9iND7{Ni@t)7&`Bx^P=Q;|p zpcGO0UKq5%`L^B) zsHesKp2aK{ITkt}M9#wI?6WL#KEIy;OR~QTYr+JJou{HB%*1{ioCbHp!?4B@Cs5p_ z&UqD>2YDY@6mEi9;U~C(_^uSooG%z$hCv+sfyyj!xsPj|4504%<|`a7fa%!ZhiYl~ zl}@7RU;*|Wp#rRch2RaC6vkQQ$aBHW?ERtV=YLFMq1K#$^`L9D^KU%r!wziE!CtW7 z8fU*1=3<{>t>dUJRDwgH0v~~?;TM<|CS2#-tR-Mo_D!KWxgHjGv+!B(e2P>W>MsVv zpx$&#jK`pEz8A0sOt``Mi%CD2hW!aBhwq^hExFP8O2=Lp$UfdCAJ6ao8V;owVYBo3 zL}TbyM(bF#f`8yx7_i0pCh}*fzkqbw>U^su@-`=M8(0kaW>^Y-frDZG?as}(7p`P~ z9qOhXxWmWud&5@4D(tK6bP}4sljlD_g5Zzz7y0nS^+1)Yj6>4yW9Ej9C?p( zQ`Lg?k&lLL;ZxWeR^994`M+M8FHxBj$yAm6w8g0l6EoP=NMOk4a}Jg9)}@0&}oG4E09)29;ps6HcJmQ1%I+-u20# zUOZ`_-uXG80vEG=WvGN3Lj1X10W9>&?E|Ga0qPYw7b?^BPzfD}3UC|B!6WDc-$2=Y zfU^4y)v0JFotx7S>ZuBVN^CGxV&h?Def~d}MOg%|?I7nVN3l3mfXXmEtPZQgJ|;hF zya;touR?$L08WIZPdlGgUx&5XCpqKXd|hB=_Sax_J^!iBI*&tlSepG0s0xalb2?KM z>R#}Ns$dq>rC0{_1&KXSpA+7IMPZEd&YQ71ROOwaKE{lP3E&E-4jzJTz4^|tC=7is zICo_UsCyw0%3vJSQ?UZ-Za)RpkvJEfkCH`UdG-yUF69!F?}U0)Ux6y#lExK-Z)#lwuF4YdQkz9+(PKz_n1BUx3lzEhzg}PzisA$zaUO&gXnNpzQiU z`JV@M53RBN=F2?)a&!=ZT6z)cW_xb?Ur>)pj4O`Z4@xf=lwAd=L>oZ8*;?EAHkgw4 z#u=!4>C!wpc^cr#SS`)z;L_BWv_ehzEH4^WS1nd{Eu z*bC~W?GKgMAXpBLxAPlN9lQ$_$NijzD*SAM&^Me*5Ebg$Cxdd7AL_X;W9L<%5@`yR zXd9@XXefPyrjmK-doIrn&_c z;5|$QL)~%$q=9l+66!8*2$eursC!`&)C+18)V;L>>JpxWp5Om{pM|dFM>`00+i@5V zs=};LEzM^vWGrUqrJ!0`8S2$r7wV>K1U)T=x~E1%eKI;9sxzCQ=l6e}XCcE#cbv+i zLwzQb8>WUqP%WGWv%(!vt$YF7!N_+VyB;tz`#CTjJOy>_KSTL1bkDhj#i2S;9(w-% z-++a#VGF2E1lfK7RHoygI`ZT*30$uxt#$YIek+xq8ba*N0Q15|^ zkDY{iL+Ou&^1Bokhx?%}aVYl_r{#s96e~fs+TYj_mSW!>s`a~}I&lih!2_t9GtpD$ zW=jUu$&65)DFKyeHK@n8EvyMU+unVYg&duQdThc!a}r1c^%!P_GAsmjQ@j6 zupfL6Lp}F#y@em4J_EY{!np_1ymUU<41{_N4?w*Ek3n9=Zr4Q?s_+I>#z|f|k5fit zZm7GrDAeOr3M#Q`wr>pOxGhwN0-^5i{!oF&LnS;5%Ks{;PVa!l_3{4#3q58rUpuYK z2lYXsDpc$0Ky@Gx>K^F<^}J7ly4mI!H$WwN1nO0O66&5f1G7S(H;%uYP&aoan1T4N zAQt{`HcSg$Z=Fk!4l0rCP?h9^s;nes8{E|CQtm%ahL_lQGVN(G*&TreJDRIp#pV->fmIk_sAOP zdG$hd?*2QTf4vevn;`6a=W$GE%nDUODX42#4(cALV{8HSKImlUgP}S!(KsC{;ki(q zS#J9cPzmgMZ_ocZ1TuUKb&X#deLpyg$)H-A6RLtDPzlw7y4hMlIqU+J&~T_1%^ax8 zcR=Y~g(~Ydm=uihqp#o-xx>ot1^h!e|S{bUcnoxR;p<3PsDzRZu z`crH_2P*MZPzfHez5A*yUPE20P@fzogfhqp^+G8RRbexzYupv;%{UC|o>^+=$DwY{ z+fet=XXpoGeRke}xu7~x1(F~?|IY-ip<2@us)Er_otO#LffXj-3Uw_H8_yW8LOH$% zRmgj&$1MC8Cy`80ui#2h=dC>C`E#>SD`!BpauHOE*V=wFR08{;^iD(FgjY@e5GwI^ zP#p^O)w%X@pdQQYPzmRO>P%6n&enyA^!#^Zp#USHp7&``mCuy|Tm#kW6HpaChtmH6 z)u}MwoWx^6$&*4|`;1V5bK1TTRDq?S{8WXWpa0Q}g(_$db#wHGaxfVxq1nboP>HRC z>ckGH1P(ztya08#KZL6M4^%*(?~Z;{sPp)+CCvTZp8uH$3L;no74QXA=I@~b{D2A^ z_J{L$#({q9vq2?N9jf&Wq4WY_8rUD|QZ0r07_bp4p@UEfp83J^ugotZkfTRX&;J`J z!*KsNorncxmDb!P>GL)itAp&LX~fZGS~}s z51fTEcm#FLen7oo;{0;-azeeDOF~sz7Rpa8D925p66y$*U@xdkIvOg@6o+ot5*9Mt z0%f?*cor(a9jF#QfVyVSp(=j^rT-hMwUPgI^y5K2zKNg$CWopx15{zfp%SPAJwN}i z6$=FjHui#YJiw#CClFA9XG1w$U|eb31eL&Us7@S%s{ArkqW7Vmt`AUteSSOoF-1N9 zNm%G6N(Yr`G27RLx&(o+3>*q|m!E-Z=>w>n^%IoiD1V#;5<_(~y)h@$d10u|RDvqF z2K4;=kNPZ>c~huYWCy5gJ`BomF;wN7pjx*ZslCsc*Qp(>dP<#;hv!1YjiyP)p&lTe+zZt{1=-%xgu zNkfUphe{wFlzx8w`$uI`%@o=|1?&lx&>*NzOf_zT>cn{{$2XvEswYsD{==V2@DEf+ zBZTtxBpMg0^{Juf)eKc&PB#lVEDcpr6{t)bLj~vvb&Y#L=}m#EcrH|+)lePW2Bm-A z&TrfPrJa8@Mh)%QrG<*;&S8t<#%fR>becka(CGu!vRP1_S`Gc+VW?~V1gfIfP}lsk zF@lfNnPgCj=7Q2MYAgdu*zKy!LM^WkRbfl03Ohh$*c&Q=kx(t01*NwJ>Kbl^YW*1~ zKNq1ocpK^xzJ~Ji2P%;$zD~mNVFZ2t@5e&dCWA2>ltCVt43>uKL;zGGL!c^|3YEwl zD91~ouK5Nie|w?y4ny5Tr=a{khq_eXpy&Vph7RNFd9LF@&&>g4m=orM1z-`_1r~#w z?EEv7qn}WL!-jS2V?o`NiJ%h92KC;^52aTbs#6W1=kNdiEIciTGUyGJ>0qc+0+oZh z`>WZ$J=9Is1?pxT3H32zAymMnP}h7D)V*>P>fX3+=XanAeF^3NdpMqdRrnWyu5GmN zPNsg)b5B5ZA{&&WqEMNavh!+Cf7h#H^7 zk@NhIU?GQ-VM(|g&W5jHSvWkhujh+L=b;|MFj0Ix-&iaKv#}ot3&2e!DLZ= zJ>T=G1pU~bgzC&I*a?P;28r(qV$lNLhZSIn=)Rth_hVso_E%s=)>wm?6BakQi3`bzNXdd3*xP|#?I!3q@D6KDiy8)#P|m1H9xXYJWH*B!>_ zp)wfi;?x)e)TIuoR98<8(8!YV5n99G0nZmt>+c zy(1rir=v5B*^%iTP0+bVH`3s96O3&MC$OR_l4KzIouE4&3H-~!mJkl)XbXv?!$CNd zVwi(C$i8v55#9J!v2@1}FcecaTSdEEBQ5Fb*q*R;L)O_St~#CZVO@ovKj(@?@O=c* z7)-Wrbw@Iano(Q!7jeFg{X@<*Zex=boBkx%#gf~EP6v{D2Q|JCWC1pZ(W%0W$G#@X z={M$O@Y?9-?`8{eok|nn3C=fTSP-QGRGOaI5yQc7mL;VCi!JF$R`DEyct>Ol@R8)R z;&TBpW^&#NA16@at?ep6vPJa!cdjCM2zyx~&&=^5>x7&><-8h3wct9_`$FLSBpY&E zr@b0im><#ANQ+)oW)Vy3Fn)WRox3TU8RoD&O7AUbb1L1$oJ~-^GV8iaQlmI;&VC)4 z=f!bhoTN0{w&=vc_6+-$1g?Y5b5D5Zj}^#TqEnwFp4%njg#Z6#)k>{74o46)8O9Z? z5+Ba*W7xtn&PM_oGvRPsr$+w+GQNQ7YL5O`W?fw>3dW4{T*_WY+qpV}1Gb%FI zKPrk(2v&*Ae^|?8^aZ8;I4s3XM`brS=f{4!O0)krgkB!@sX6Zp{qeI9j>Nei_LY&R zK=(a~eqh!kcp;L=YsFl3qo|Pur9~W;W4+n39*zU=c!1tNoae-$#uM}hhDf5PIh@b= zL8c!SXCRS**qkBodu--0^C>BcsDf>N&fPT;j>UMNIrFu)cR(p03WqG2Cg`Nb*q?cf zWJ008iSvnYHl5)Iq`Jz6NO&VU+017S&a&cX5wblb(~1Odz-fH^aos}r8pGpcx(G)a zC9TS5tbH-;0VAWAgXHFr2!E5-7s>gQoXaHV*ll3niS-ophG74Q;I&ytN572~(GPvp zJmW07mpwm!k8NL+w%LIf^~~rkPUhKKXZ`Sy6z3aAI67_qjcqQR30@yKuUZZX~qJp!dUlWILIONMbTNrwFu{InkV+ zM0W#8ddFhx;x=pw5G*Hl897ftGRsM3Bl1k9QXU zX%d{4$Kfi@CosQS!remn7>e#q%c?9fhLF5QMs)aRB>LQffB!`gjcf?h5M&WEG|uOe z`7v{<^J7#Snkup**VhWYPfjfKH5ziBo%MMFjj|*b5#*Bj=PP=y{3P%my;hdUL*l#2 zAqYpHV5;Hoh@P<({)1d2AIW&fZgZ9l-3G{Sqql~DWtcC~?}j|91qM?yJ1l|f z$eIxRvsIkpS#f=iM%X!NvyD2bm$_!!t3jA4cL@N@jHUCBvag~ zlCvCS8xy%k&k#YYvfoQ$R|zs19k(1>B2`GBHTOY1g5`%HM?P#~nBFSZdG+(RUJ@Wa zL60))a@ZXQlW=$g4z_CKBr$6s0YJtxj9V(w$QpQ<`q(-g(680AGN8qP-Iq#*$o!VloPhHO zICxF6i%H-q`lWO)aHg>ne#B`$bk1Ts4V^VijTFd!SOIICACXlWASo87La=#DV^RRr>m1;~!F@5*d}a0B{Xss1B-{vzdC z#(5Hb{y)Gh>RYgK9Bw3Fa%KQo{%2TQ^%ag&R@uuC0UKfWh*{k9hGDzT>^qZWYV$9D zTg}d$0!Jq?7--i{hkG!JLJND4zZBe_xQCzjMDoZrA7fA4hN zXWfyreXM)n^Do?Ii6r!V{f)!6DBrcLv*BR1BjNva}&PoZ}j+hOpG^zHt0 z)h57obCA=VXU5SbjAmo35yZ@D4t)rq(G#0XthZV98%gqC_I%gXRS|pdC~f-Q{bSDf zj*iQn48v<=bB&W3rj)<}Ua;%rH4+2S8Gzw==5Ugk1vL^9xF$tt@D&?ZcYBgP)1jEQ zPKE9qY?^UCml*tPdZ&K=t;qj1)|(^|2Dx!^!rJduoNArW-j@J3=vsvke$ui|V+F*< zb|i_%wE~mjuN289((iwrLNb=OSQbaYw(f(xqqSIHztquO(q69vT z-zDgcATf<4%x$`y>i-!6=D^@MnH^_6joIe4`EH@} zg=CJS&o5GNH6r){bYEC<@>PTLZtRyMf6ab9w(iXqs2@U&>K1GePG)29lNphz(EtOD zmpGY3q6x6cgnm=bN86dsk8_@sL{3??{H7LH9`-HRmw-R9*+qhZVW|Hf94)7s`5cCW z-f_~5ds$+qaJq;f*9kU;bw*2SJ8O+^u&^bseK&$`WgbMYixv4Coiyl-#LsNvcGBPf z`9}(_KPYu4;3HFPNg|n1nge4Zzl@_o<~%os0kph6Y=LYh6@}w`4tfKaf$TMkS>pA~ zr(}Gw+_loqZ(?()1A!kABn1w=BRK}UQ9Ot9b12v6d@0FPM4>fj!K^jL;vlDW;U0Uw z{QIBLmf*`d>wzvgxnA%`lF19d#BvYB>qI@_YRkIk%x zkEi&$h&(p><5{;NsmaL8BfE?&5TDD`HO~td9$=G^0}VfvU*YH`)EDwKRO}xD&WF)) z7>3HuTGjE8hr{7R_IZ)t=X{M_hD!MH$9HCY?Xb(0hw}{VAK=uz*_`CEY7}ffhmA>w z?@YLMo1f^iDg6It&-z6+cD7T}U~q$_7Dkw0f2o&+^Uun)ufE$gQG zgug$=Upzk}XTDGBZ^xUQGtZx`aCq00%aXl!9K~o9-I>AM zkHbPZFN>2Srkjd$jW;Br@2st4KZ`^(w&HULHcyc4W}gbXMew)|^|18jU@L|i*$Mg? z?jn#zN=xD>=LK;1-4VN*(CW@qS%~u*B$JVK5Pni&*MI=q&>dsCb&zYMN0t_DWu9g} z!p8Hkw!lF>1o7cBt0)c13)yR2paOm8^dDr!nFVop5ME#|wpOOIM01sV(z!&Tj;x8CkH+^>0oy9Tc7Y;Srp_mIc#nBnoV?9z{lo-xM&pS#GyfYhLcbq3jW7Dsk-IIp^wKcDBX5arEH{D6;^-mH zcVIAuV5>Ojg@VRLW^r_$Sd*KO7&m&91KT zFE*1ni;V7Sj~DJ6>=QZ#x?R~>@&Y;5GZ0RM}3!F$lx{0B66@?SQB*4*L>N zBQZK*ZC#mwf!4i>#;n*+BB8MCBcNA;LZiUHdj3an7zgJ=tfi${zhi1NG^fsv=bJ#$ zOwTJ5*O;sYj?*wTu3PXcBpro0g#?QI_TpI7-A5*%}MMU@J>JJ;`dk!%r4wG|o=zrxOjs zXexnQ5qKX{qbte@%peixIceE+=5ISc93q*tI2y>=DCQx~W(mE{b zrkwrNCrio5egz4PWNMV>U&NJc5*L*)gcNAwQOz%I>Uk$5P35;jmjQ|U9I1&dM5omQgg6GH49g|5u*wzy` zE6Mr|b^{1*Ql zC*QBVU5Ag~)1Rr*Voo9GjEuCvbLzwKMGf zcNn9H%ytA$O=Z`t3%RL00ogY}dq1-aXJajJm=Fo?GX1(R1M<@Z`ba{1*}uichk$SJ z<%jK0F6(p)@2S5%0e+z{4#PnxYs53>Gf~zEi(wtkN}yZA5qbWsZ|8fAi3k#aZc1yp zl;$Bj#J(dw_1(CrR{c`e?zm(*0D(RbX`CbTh_rMI@>OKdf0}UBVSNh+>0nFrjavP!fcKvFr-32nA5S&tw{PXaGCn?lIak=#<45xwms+Yz0M z$TlE5qL0NI!`NiUVH^^u#{MV@Eja5;BJ+^#@o4cVp?8IO%=X;LTGDp^^ECn-R6%hEL1*K%FV)Uv9|YGEuoH=BG723Ot7iw#WC4H)*AEm+iA8TjDf-!GX2eZzEu>L^({xw^Jff%wTkNomNA>^waS$g{QNG0Nk9aOTO@Jc=d`orHvFBF;yFOYG zZIElU#^(w2nsI)WB(|V)8U3-$M4XrQes|;$;WRmC{`%h@s#7(#MssI)KQ znaJ{T*46a)uvRC3ptr?*6=dI*y~Z*Uctrv!NGJ&3De#q&*)}xwr^3k$GAc<`-m!$k zcFZ=&&vRawzzcC)72^Pux)bmf0g6HIXw14J0nQ=Ff*rq&+4F;Gjv(uANu?&nLgaDm zlBM!Kf0r;gjNxM#a#X=sBQb&hH7DVzCK2ln7W@c2#w=sD3C+0=`)>s64Wo13fVIXK z>@&09g53QNe>^2fEUFy9`j-W~k77;>m=C#kl*X{7?OWsMD;0$%U=ei7VjJ1c7SsB0 zoCnbMe_3~8eGT2Z>|@}p47~0A?ueW>uwWag)DOiYw7(=t6=S`Lpc>C`-UB^;9jt37 z+-q{3MM4%1{f@|gOTc(Xkb3yh=w|+7lE{2yFFl3Q|IRoWg5wb=Yg9FAJ(W3}vl>*m zmc;H`bvoNauvf4cj)JYV{p^O*xpy?eCJ{k3acQMQ0g)LXL@Snp#IQ>0ifY!f`f)otQr?$TlsJEMdmyY?V4u^?4qj2=;Ss1BIumO$q%}ap6SBZ8B4(9gg=gAlLlEJ zehQ+iu^t~9Uy*q}?K?(x3kjSBg<8xF&be!!9Fx69H;e`nI6Mx$BRje;En&%?u^+^F zLK5B#4_P-Sv!9G!U1X*3(+0gHtiS2&KN`!KwGmdNqJ;!$M$oIQ(~@CRZkDC2Yhe&% znI}j0mN~D4?jGiPsyt1gtmqfRE(|&ataI0~J4ph4@X;$o!kHsE@m&K55X8Yz3!tQi zA=_=r0VI_f$L(+$%UV1iSt$#!1^H=`sLvc|=Z(?Vs6$E2!IPH6dhA}~qa<^X=}EUdK048@TiEbx z;XUK9bD(HO{$f4T{ZiGLb}HBAY^zUCBNYvLJM05k#Y`16TMEo!dZC zCD6ZuEG544;Nz*CSD-7C2wue5JN?gqlR6l@wyM(-yb%FPurH6|a?a{fMF*?uEN5Xz zA_cQG!N#Fif%9|7r=kA{`(D^AW1W%pcl0#EqL&MKHe|Q4>#gsOwZLc;8KpqDnzhDa z3?s9zWC{JoNFzRazc3tvUR`Tp94dT;tOfdencF#w4K?nlgUs{Dsb32&}P|>i!{t$oOc?J^}mwtg|XGz9v&l zNpB%W+0De>-JWYc5Cx4&7(GUq8QDTO&=I@ByO2ab)|oliC{2>L zkqst+hZblOdeM+Y#6A&vS158RdV`%J-L3>Ev_f#-k~o0zeG(apViwk~k*_A1Pptp2 zZfe0IVpAQxdz{rqeja8b=w*ThB2U6T8oGP1(?H}(j?YpA{)T=o;)d7Pe~#0-;TY9M zc`!<|G1MplZ^M6a5FexE7I>QH)cKd| z34^Xwa1>{|WX(v5aWiI061Z(P9kE$Pq9+{{*LIT7ILrAdY}=wA%(}64A{pm@@&5wZ zU~Ct5AmAf&c9LuxFiWwIhCy|!WTKt-#Bi~#cRF!gZ_z7CkV2+g1*aMvN%At&JNO@4 zu5`|K{C49;V;jefFzbSgILMN*E(=HX*he!e91lvMGQjcGX*vv*_h1D`i{>$0#`=)wgreruv=M4(I8~JOgtgvXvxok@a!bwb5^iQ;m4&1;Zxnw}wbWXEQD7k(@muRu#Kk?npS& z*uq?Gt<=5;iY1xXFiga(g~Jsv3_$}}k3`p>^9~dc4cQ z{jo{P+J^JQx5r@?%cv-=(I|lOG2}U{LsxNhjCs~Nb%vm^P4^PE-KqW+EM^@nKp>4A z?8jkKk6FxONL~zk=Zy;*;iw)n0ZxWuc*Jwa2TRsdFbZQy+@+Gx$TrwsE(X)V2-qG( z)|PpKIf%qHMlkD>^f;2Jf!=t0Wg(Fl_|Ky*sQw@p`7P^e7!M%8P`fPC*>@$WDHxSx zYV=IQ@*Ys(P0A1AR0_?!wV zv0s33E4TsqON>^LSS6~Rit|YX%g?$7XWLm<;ygU(?U+BX(->+=XdS@0cbs8yR^Rc7 zg0LDhBALZD<#ssKs87XX%u#;Mr{Xv-Jc(>6Nj`SeTr1JrU=>Q#ntdKSYe0hD@e7-s z=pDdEBy@7=|HI8Rg*2938w=iy%hJd?!+#icCAH*|;iNpX40?T-_0W69{*&2XfpyT` zO@LR-V&?COWswYDU(nYGaGTTiR8*OkPvu|_249_X*92r^$aW8ve}o$MIe&xxC1fSA z*L|eXn{^{gLi=UtWumwetS?YVZVRfjwN|wA{2}NNqD_A=oWaaZkZ5?HgK&3RgOBNShT+8b$LIly*D#z- zP>rc@BZ}XVkLLUeyobZ9Fq~uTx{m%=t9Uog`!F>oU|Siz7zFKZ{$k)G3ii*~|EFs2 z>Ig<@Iar56T7s^}_%8b@IFHM^9RYXX>^+rcMYb4cC8(so+KTKK=bZ^Y4*OcjG{&+o zz&aRze^~Ehofx|d%;Q#oH@+(@K}v9tkNE@RBee4u&NR{ya3$-g=y=Czt2!aP&Dlbd zEze;p7@I(=;0hA{e~mgJ{J7g&w(-$i%A7^Ey{POH#$!=ThOC1na?9v-T9ITmGNG?g zgQ}{a)12g+S%v?S;9zD#WFf~gI?_Glm6&S=J1y(@mgQLz%0@MVU>VLrTf(1cdq+*y1(&T+!6if&;6WbB%#duithu&uL#x_V~v&Y4$gXna6X1guV9dc zN+YoDOfn(IK!SWFSWQdbd$s~U8f~pZcd&hf|NHn}2NUc6!+f^NYa+OZ!46s&Xoilt z^QYbwcgQ>mL8_9#KE(Z4za#l&*xU&b+}rKq=*_}cpb2ubPmGUpR-8L0f+b|`Z;|$( zJRSv&o+z~nk;orpIXSC^vszYB5@a_?U^TML_?c$+#Aft1QP@q2noDvY*f&J4zBdu{ zazx?&e~54@hrVzf>~0QH5nvko890c;S$`5)##*B%mBwJ-$T~NR02<9mK;w;ZAa>pn zne}_?P;_Ff#P?nOjc*wmUvXR!XT?#fVwFWk;h-7xGDpYA-VfPfI`bDNdkLHyyFzqP zqcUgNWXIVoe5S=$77{(`96LJLWM(yl*+$nt2<2cLcEI=qfxfcOW)44DB@H<1V@XuR zK^Ak^2IoCV;4U&>0=wA1#by*snHFMy7T?LR&uKR8&36}yapysyv9+-i>yYC*ioVRz zIL=B^-jRWQ4V;!CLJ^WmiCqzMT7W=vm}}W*x8#RnTa6g+ybj<2x)b328=vHn$)*^Sc zVJ|)ZeKD*=@WK{s9_tl&*$yu-Uz=Qxm$KJ5gu@(gH~rGiG4l5zE`g)%{Mm-U?eTM$S(7dWpqG@R zSC*`__LEp^&U`rAgwOVlsmq;&U^`L#!<@~WfU{}@OTa8jQmF|(AIB?bcP5i4>2HD8u)l%7g~$p*jhWcKXWa( zuS_*0CPtGn*Df;&fvT>0SlAN8rEx>>CpF%7U&-%KrRwm0oTJ^ z=!RpK!R`}&mg2V;T#al9KHc@P9!=YlBfN)_Mg*&Fvh9Czo)_gS==6sr(Ro1PX9yk{ zho3xF&L1^M;yTOZoIm9389rW<=wtSUpm(ey!Q%So(MiZ87fv-oAq>M_dX-5c66>vO z3UdB0)nvf=JRBWFFFZ-bM`tHz#gWY;xqc*ckD1qdrU&_@Y4oa zYQ6tEVyMy1s?|CQhL3SH-LCC;D$$69vjqfO#O!H7=3v(i=gn;J=SMDY+a5k|jItYA)u!{s<`ZWV6j>;%pi zLpMOC2wk-qvS_XCu3hWfn zsjFYtfZ&d8J2mgxHn3Bd^xOM(4|SkZn&zDXI{0;J-Z8+j2@32H5bW0~Ai)2>w72Jc z8Y*p)NX}`HY^K);9lH2`2}Xww-7SfKfM1_3ZT$n9b_)s$2<}(FuaC#3sblkYoKJ%7 zuQBX6{c~XG^p3fmjf?5)x4lGA=v_hC$_4}{x3xeZxHH#02xR1wEzGB delta 74169 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 R2M(QqU%Zftas3K}`9GCjT>k(7 diff --git a/netbox/translations/de/LC_MESSAGES/django.po b/netbox/translations/de/LC_MESSAGES/django.po index 87242f072..66c5924de 100644 --- a/netbox/translations/de/LC_MESSAGES/django.po +++ b/netbox/translations/de/LC_MESSAGES/django.po @@ -18,7 +18,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-04-10 05:39+0000\n" +"POT-Creation-Date: 2026-04-14 05:39+0000\n" "PO-Revision-Date: 2023-10-30 17:48+0000\n" "Last-Translator: chbally, 2026\n" "Language-Team: German (https://app.transifex.com/netbox-community/teams/178115/de/)\n" @@ -184,8 +184,8 @@ msgstr "Standortgruppe (URL-Slug)" #: netbox/dcim/forms/bulk_edit.py:329 netbox/dcim/forms/bulk_edit.py:679 #: netbox/dcim/forms/bulk_edit.py:866 netbox/dcim/forms/bulk_import.py:146 #: netbox/dcim/forms/bulk_import.py:247 netbox/dcim/forms/bulk_import.py:349 -#: netbox/dcim/forms/bulk_import.py:640 netbox/dcim/forms/bulk_import.py:1612 -#: netbox/dcim/forms/bulk_import.py:1640 netbox/dcim/forms/filtersets.py:106 +#: netbox/dcim/forms/bulk_import.py:640 netbox/dcim/forms/bulk_import.py:1659 +#: netbox/dcim/forms/bulk_import.py:1687 netbox/dcim/forms/filtersets.py:106 #: netbox/dcim/forms/filtersets.py:256 netbox/dcim/forms/filtersets.py:379 #: netbox/dcim/forms/filtersets.py:483 netbox/dcim/forms/filtersets.py:855 #: netbox/dcim/forms/filtersets.py:1073 netbox/dcim/forms/filtersets.py:1147 @@ -463,7 +463,7 @@ msgstr "Dienst ID" #: netbox/dcim/forms/bulk_edit.py:611 netbox/dcim/forms/bulk_edit.py:809 #: netbox/dcim/forms/bulk_edit.py:1063 netbox/dcim/forms/bulk_edit.py:1162 #: netbox/dcim/forms/bulk_edit.py:1189 netbox/dcim/forms/bulk_edit.py:1723 -#: netbox/dcim/forms/bulk_import.py:1484 netbox/dcim/forms/filtersets.py:1220 +#: netbox/dcim/forms/bulk_import.py:1500 netbox/dcim/forms/filtersets.py:1220 #: netbox/dcim/forms/filtersets.py:1545 netbox/dcim/forms/filtersets.py:1761 #: netbox/dcim/forms/filtersets.py:1780 netbox/dcim/forms/filtersets.py:1804 #: netbox/dcim/forms/filtersets.py:1823 netbox/dcim/tables/devices.py:806 @@ -495,8 +495,8 @@ msgstr "Farbe" #: netbox/dcim/forms/bulk_import.py:813 netbox/dcim/forms/bulk_import.py:839 #: netbox/dcim/forms/bulk_import.py:865 netbox/dcim/forms/bulk_import.py:886 #: netbox/dcim/forms/bulk_import.py:972 netbox/dcim/forms/bulk_import.py:1101 -#: netbox/dcim/forms/bulk_import.py:1120 netbox/dcim/forms/bulk_import.py:1465 -#: netbox/dcim/forms/bulk_import.py:1677 netbox/dcim/forms/filtersets.py:1104 +#: netbox/dcim/forms/bulk_import.py:1120 netbox/dcim/forms/bulk_import.py:1481 +#: netbox/dcim/forms/bulk_import.py:1724 netbox/dcim/forms/filtersets.py:1104 #: netbox/dcim/forms/filtersets.py:1205 netbox/dcim/forms/filtersets.py:1333 #: netbox/dcim/forms/filtersets.py:1424 netbox/dcim/forms/filtersets.py:1444 #: netbox/dcim/forms/filtersets.py:1464 netbox/dcim/forms/filtersets.py:1484 @@ -554,8 +554,8 @@ msgstr "Providerkonto" #: netbox/dcim/forms/bulk_import.py:103 netbox/dcim/forms/bulk_import.py:162 #: netbox/dcim/forms/bulk_import.py:265 netbox/dcim/forms/bulk_import.py:374 #: netbox/dcim/forms/bulk_import.py:605 netbox/dcim/forms/bulk_import.py:765 -#: netbox/dcim/forms/bulk_import.py:1230 netbox/dcim/forms/bulk_import.py:1453 -#: netbox/dcim/forms/bulk_import.py:1672 netbox/dcim/forms/bulk_import.py:1735 +#: netbox/dcim/forms/bulk_import.py:1230 netbox/dcim/forms/bulk_import.py:1469 +#: netbox/dcim/forms/bulk_import.py:1719 netbox/dcim/forms/bulk_import.py:1782 #: netbox/dcim/forms/filtersets.py:208 netbox/dcim/forms/filtersets.py:268 #: netbox/dcim/forms/filtersets.py:396 netbox/dcim/forms/filtersets.py:504 #: netbox/dcim/forms/filtersets.py:901 netbox/dcim/forms/filtersets.py:1024 @@ -616,8 +616,8 @@ msgstr "Status" #: netbox/dcim/forms/bulk_edit.py:799 netbox/dcim/forms/bulk_edit.py:1746 #: netbox/dcim/forms/bulk_import.py:122 netbox/dcim/forms/bulk_import.py:167 #: netbox/dcim/forms/bulk_import.py:258 netbox/dcim/forms/bulk_import.py:379 -#: netbox/dcim/forms/bulk_import.py:579 netbox/dcim/forms/bulk_import.py:1471 -#: netbox/dcim/forms/bulk_import.py:1728 netbox/dcim/forms/filtersets.py:143 +#: netbox/dcim/forms/bulk_import.py:579 netbox/dcim/forms/bulk_import.py:1487 +#: netbox/dcim/forms/bulk_import.py:1775 netbox/dcim/forms/filtersets.py:143 #: netbox/dcim/forms/filtersets.py:202 netbox/dcim/forms/filtersets.py:235 #: netbox/dcim/forms/filtersets.py:363 netbox/dcim/forms/filtersets.py:442 #: netbox/dcim/forms/filtersets.py:463 netbox/dcim/forms/filtersets.py:823 @@ -803,7 +803,7 @@ msgstr "Beschreibung" #: netbox/circuits/forms/bulk_edit.py:192 #: netbox/circuits/forms/model_forms.py:199 -#: netbox/dcim/forms/bulk_import.py:1419 netbox/dcim/forms/bulk_import.py:1444 +#: netbox/dcim/forms/bulk_import.py:1427 netbox/dcim/forms/bulk_import.py:1460 msgid "Termination type" msgstr "Typ des Abschlusspunktes" @@ -933,7 +933,7 @@ msgstr "Transportnetz Typ" #: netbox/dcim/forms/bulk_import.py:105 netbox/dcim/forms/bulk_import.py:164 #: netbox/dcim/forms/bulk_import.py:267 netbox/dcim/forms/bulk_import.py:376 #: netbox/dcim/forms/bulk_import.py:607 netbox/dcim/forms/bulk_import.py:767 -#: netbox/dcim/forms/bulk_import.py:1232 netbox/dcim/forms/bulk_import.py:1674 +#: netbox/dcim/forms/bulk_import.py:1232 netbox/dcim/forms/bulk_import.py:1721 #: netbox/ipam/forms/bulk_import.py:200 netbox/ipam/forms/bulk_import.py:264 #: netbox/ipam/forms/bulk_import.py:300 netbox/ipam/forms/bulk_import.py:531 #: netbox/ipam/forms/bulk_import.py:544 @@ -949,8 +949,8 @@ msgstr "Betriebsstatus" #: netbox/circuits/forms/bulk_import.py:235 #: netbox/dcim/forms/bulk_import.py:126 netbox/dcim/forms/bulk_import.py:171 #: netbox/dcim/forms/bulk_import.py:383 netbox/dcim/forms/bulk_import.py:583 -#: netbox/dcim/forms/bulk_import.py:1475 netbox/dcim/forms/bulk_import.py:1669 -#: netbox/dcim/forms/bulk_import.py:1732 netbox/ipam/forms/bulk_import.py:49 +#: netbox/dcim/forms/bulk_import.py:1491 netbox/dcim/forms/bulk_import.py:1716 +#: netbox/dcim/forms/bulk_import.py:1779 netbox/ipam/forms/bulk_import.py:49 #: netbox/ipam/forms/bulk_import.py:78 netbox/ipam/forms/bulk_import.py:106 #: netbox/ipam/forms/bulk_import.py:126 netbox/ipam/forms/bulk_import.py:146 #: netbox/ipam/forms/bulk_import.py:174 netbox/ipam/forms/bulk_import.py:259 @@ -1023,8 +1023,8 @@ msgstr "Schnittstelle" #: netbox/dcim/forms/bulk_edit.py:445 netbox/dcim/forms/bulk_edit.py:684 #: netbox/dcim/forms/bulk_edit.py:733 netbox/dcim/forms/bulk_edit.py:875 #: netbox/dcim/forms/bulk_import.py:252 netbox/dcim/forms/bulk_import.py:355 -#: netbox/dcim/forms/bulk_import.py:646 netbox/dcim/forms/bulk_import.py:1618 -#: netbox/dcim/forms/bulk_import.py:1652 netbox/dcim/forms/filtersets.py:114 +#: netbox/dcim/forms/bulk_import.py:646 netbox/dcim/forms/bulk_import.py:1665 +#: netbox/dcim/forms/bulk_import.py:1699 netbox/dcim/forms/filtersets.py:114 #: netbox/dcim/forms/filtersets.py:358 netbox/dcim/forms/filtersets.py:393 #: netbox/dcim/forms/filtersets.py:438 netbox/dcim/forms/filtersets.py:491 #: netbox/dcim/forms/filtersets.py:820 netbox/dcim/forms/filtersets.py:864 @@ -1453,7 +1453,7 @@ msgstr "" #: netbox/extras/models/models.py:417 netbox/extras/models/models.py:482 #: netbox/extras/models/models.py:567 netbox/extras/models/models.py:692 #: netbox/extras/models/notifications.py:126 -#: netbox/extras/models/scripts.py:31 netbox/ipam/models/asns.py:18 +#: netbox/extras/models/scripts.py:29 netbox/ipam/models/asns.py:18 #: netbox/ipam/models/fhrp.py:24 netbox/ipam/models/services.py:51 #: netbox/ipam/models/services.py:80 netbox/ipam/models/vlans.py:38 #: netbox/ipam/models/vlans.py:217 netbox/ipam/models/vlans.py:363 @@ -1698,7 +1698,7 @@ msgstr "Abschlusspunkte" #: netbox/dcim/forms/bulk_import.py:1096 netbox/dcim/forms/bulk_import.py:1115 #: netbox/dcim/forms/bulk_import.py:1134 netbox/dcim/forms/bulk_import.py:1146 #: netbox/dcim/forms/bulk_import.py:1194 netbox/dcim/forms/bulk_import.py:1316 -#: netbox/dcim/forms/bulk_import.py:1722 netbox/dcim/forms/connections.py:34 +#: netbox/dcim/forms/bulk_import.py:1769 netbox/dcim/forms/connections.py:34 #: netbox/dcim/forms/filtersets.py:156 netbox/dcim/forms/filtersets.py:1021 #: netbox/dcim/forms/filtersets.py:1054 netbox/dcim/forms/filtersets.py:1202 #: netbox/dcim/forms/filtersets.py:1418 netbox/dcim/forms/filtersets.py:1441 @@ -4318,8 +4318,8 @@ msgstr "Luftstrom" #: netbox/dcim/forms/bulk_edit.py:444 netbox/dcim/forms/bulk_edit.py:897 #: netbox/dcim/forms/bulk_import.py:362 netbox/dcim/forms/bulk_import.py:365 -#: netbox/dcim/forms/bulk_import.py:653 netbox/dcim/forms/bulk_import.py:1659 -#: netbox/dcim/forms/bulk_import.py:1663 netbox/dcim/forms/filtersets.py:123 +#: netbox/dcim/forms/bulk_import.py:653 netbox/dcim/forms/bulk_import.py:1706 +#: netbox/dcim/forms/bulk_import.py:1710 netbox/dcim/forms/filtersets.py:123 #: netbox/dcim/forms/filtersets.py:359 netbox/dcim/forms/filtersets.py:448 #: netbox/dcim/forms/filtersets.py:462 netbox/dcim/forms/filtersets.py:501 #: netbox/dcim/forms/filtersets.py:874 netbox/dcim/forms/filtersets.py:1086 @@ -4380,7 +4380,7 @@ msgstr "Schema" #: netbox/dcim/forms/bulk_edit.py:555 netbox/dcim/forms/bulk_edit.py:562 #: netbox/dcim/forms/bulk_edit.py:793 netbox/dcim/forms/bulk_import.py:460 -#: netbox/dcim/forms/bulk_import.py:1459 netbox/dcim/forms/filtersets.py:690 +#: netbox/dcim/forms/bulk_import.py:1475 netbox/dcim/forms/filtersets.py:690 #: netbox/dcim/forms/filtersets.py:1215 netbox/dcim/forms/model_forms.py:444 #: netbox/dcim/forms/model_forms.py:457 netbox/dcim/tables/modules.py:43 #: netbox/extras/forms/filtersets.py:413 @@ -4505,8 +4505,8 @@ msgstr "Label" msgid "Length" msgstr "Länge" -#: netbox/dcim/forms/bulk_edit.py:818 netbox/dcim/forms/bulk_import.py:1478 -#: netbox/dcim/forms/bulk_import.py:1481 netbox/dcim/forms/filtersets.py:1228 +#: netbox/dcim/forms/bulk_edit.py:818 netbox/dcim/forms/bulk_import.py:1494 +#: netbox/dcim/forms/bulk_import.py:1497 netbox/dcim/forms/filtersets.py:1228 msgid "Length unit" msgstr "Längeneinheit" @@ -4514,17 +4514,17 @@ msgstr "Längeneinheit" msgid "Domain" msgstr "Domäne" -#: netbox/dcim/forms/bulk_edit.py:892 netbox/dcim/forms/bulk_import.py:1646 +#: netbox/dcim/forms/bulk_edit.py:892 netbox/dcim/forms/bulk_import.py:1693 #: netbox/dcim/forms/filtersets.py:1316 netbox/dcim/forms/model_forms.py:891 msgid "Power panel" msgstr "Stromverteiler" -#: netbox/dcim/forms/bulk_edit.py:914 netbox/dcim/forms/bulk_import.py:1682 +#: netbox/dcim/forms/bulk_edit.py:914 netbox/dcim/forms/bulk_import.py:1729 #: netbox/dcim/forms/filtersets.py:1338 msgid "Supply" msgstr "Versorgung" -#: netbox/dcim/forms/bulk_edit.py:920 netbox/dcim/forms/bulk_import.py:1687 +#: netbox/dcim/forms/bulk_edit.py:920 netbox/dcim/forms/bulk_import.py:1734 #: netbox/dcim/forms/filtersets.py:1343 msgid "Phase" msgstr "Phase" @@ -4757,7 +4757,7 @@ msgid "available options" msgstr "verfügbare Optionen" #: netbox/dcim/forms/bulk_import.py:149 netbox/dcim/forms/bulk_import.py:643 -#: netbox/dcim/forms/bulk_import.py:1643 netbox/ipam/forms/bulk_import.py:512 +#: netbox/dcim/forms/bulk_import.py:1690 netbox/ipam/forms/bulk_import.py:512 #: netbox/virtualization/forms/bulk_import.py:64 #: netbox/virtualization/forms/bulk_import.py:102 msgid "Assigned site" @@ -4821,7 +4821,7 @@ msgstr "" msgid "Parent site" msgstr "Übergeordneter Standort" -#: netbox/dcim/forms/bulk_import.py:359 netbox/dcim/forms/bulk_import.py:1656 +#: netbox/dcim/forms/bulk_import.py:359 netbox/dcim/forms/bulk_import.py:1703 msgid "Rack's location (if any)" msgstr "Lokation des Racks (falls vorhanden)" @@ -4890,7 +4890,7 @@ msgstr "Plattform wurde nicht gefunden." msgid "Limit platform assignments to this manufacturer" msgstr "Betriebssystem-Zuweisungen auf diesen Hersteller beschränken" -#: netbox/dcim/forms/bulk_import.py:576 netbox/dcim/forms/bulk_import.py:1725 +#: netbox/dcim/forms/bulk_import.py:576 netbox/dcim/forms/bulk_import.py:1772 #: netbox/tenancy/forms/bulk_import.py:116 msgid "Assigned role" msgstr "Zugewiesene Rolle" @@ -5101,7 +5101,7 @@ msgid "VDC {vdc} is not assigned to device {device}" msgstr "VDC {vdc} ist dem Gerät {device} nicht zugewiesen" #: netbox/dcim/forms/bulk_import.py:1103 netbox/dcim/forms/bulk_import.py:1121 -#: netbox/dcim/forms/bulk_import.py:1468 +#: netbox/dcim/forms/bulk_import.py:1484 msgid "Physical medium classification" msgstr "Klassifizierung des physikalischen Mediums" @@ -5205,69 +5205,93 @@ msgstr "Standort des übergeordneten Geräts A (falls vorhanden)" msgid "Side A device" msgstr "Gerät Seite A" -#: netbox/dcim/forms/bulk_import.py:1413 netbox/dcim/forms/bulk_import.py:1438 -msgid "Device name" -msgstr "Name des Geräts" +#: netbox/dcim/forms/bulk_import.py:1414 netbox/dcim/forms/bulk_import.py:1447 +msgid "Device name (for device component terminations)" +msgstr "Gerätename (für Gerätekomponentenabschlüsse)" -#: netbox/dcim/forms/bulk_import.py:1416 +#: netbox/dcim/forms/bulk_import.py:1417 +msgid "Side A power panel" +msgstr "Seite A - Stromversorgungspanel" + +#: netbox/dcim/forms/bulk_import.py:1421 netbox/dcim/forms/bulk_import.py:1454 +msgid "Power panel name (for power feed terminations)" +msgstr "Name der Schalttafel (für Anschlüsse der Stromzuführung)" + +#: netbox/dcim/forms/bulk_import.py:1424 msgid "Side A type" msgstr "Typ Seite A" -#: netbox/dcim/forms/bulk_import.py:1422 +#: netbox/dcim/forms/bulk_import.py:1430 msgid "Side A name" msgstr "Name der Seite A" -#: netbox/dcim/forms/bulk_import.py:1423 netbox/dcim/forms/bulk_import.py:1448 +#: netbox/dcim/forms/bulk_import.py:1431 netbox/dcim/forms/bulk_import.py:1464 msgid "Termination name" msgstr "Name des Abschlusspunktes" -#: netbox/dcim/forms/bulk_import.py:1428 +#: netbox/dcim/forms/bulk_import.py:1436 msgid "Side B site" msgstr "Seite B" -#: netbox/dcim/forms/bulk_import.py:1432 +#: netbox/dcim/forms/bulk_import.py:1440 #: netbox/wireless/forms/bulk_import.py:114 msgid "Site of parent device B (if any)" msgstr "Standort des übergeordneten Geräts B (falls vorhanden)" -#: netbox/dcim/forms/bulk_import.py:1435 +#: netbox/dcim/forms/bulk_import.py:1443 msgid "Side B device" msgstr "Gerät Seite B" -#: netbox/dcim/forms/bulk_import.py:1441 +#: netbox/dcim/forms/bulk_import.py:1450 +msgid "Side B power panel" +msgstr "Seite B - Stromversorgungspanel Seite B" + +#: netbox/dcim/forms/bulk_import.py:1457 msgid "Side B type" msgstr "Typ Seite B" -#: netbox/dcim/forms/bulk_import.py:1447 +#: netbox/dcim/forms/bulk_import.py:1463 msgid "Side B name" msgstr "Name der Seite B" -#: netbox/dcim/forms/bulk_import.py:1456 +#: netbox/dcim/forms/bulk_import.py:1472 #: netbox/templates/dcim/panels/connection.html:60 #: netbox/wireless/forms/bulk_import.py:133 msgid "Connection status" msgstr "Status der Verbindung" -#: netbox/dcim/forms/bulk_import.py:1462 +#: netbox/dcim/forms/bulk_import.py:1478 msgid "Cable connection profile" msgstr "Kabelverbindungsprofil" -#: netbox/dcim/forms/bulk_import.py:1487 +#: netbox/dcim/forms/bulk_import.py:1503 msgid "Color name (e.g. \"Red\") or hex code (e.g. \"f44336\")" msgstr "Farbname (z. B. „Rot“) oder Hex-Code (z. B. „f44336\")" -#: netbox/dcim/forms/bulk_import.py:1542 +#: netbox/dcim/forms/bulk_import.py:1564 +#, python-brace-format +msgid "" +"Side {side_upper}: {power_panel} {termination_object} is already connected" +msgstr "" +"Seite {side_upper}: {power_panel} {termination_object} ist bereits verbunden" + +#: netbox/dcim/forms/bulk_import.py:1570 +#, python-brace-format +msgid "{side_upper} side termination not found: {power_panel} {name}" +msgstr "{side_upper} Seite Abschluss nicht gefunden: {power_panel} {name}" + +#: netbox/dcim/forms/bulk_import.py:1588 #, python-brace-format msgid "Side {side_upper}: {device} {termination_object} is already connected" msgstr "" "Seite {side_upper}: {device} {termination_object} ist bereits verbunden" -#: netbox/dcim/forms/bulk_import.py:1548 +#: netbox/dcim/forms/bulk_import.py:1594 #, python-brace-format msgid "{side_upper} side termination not found: {device} {name}" msgstr "{side_upper} Standort Abschluss nicht gefunden: {device} {name}" -#: netbox/dcim/forms/bulk_import.py:1569 +#: netbox/dcim/forms/bulk_import.py:1616 #, python-brace-format msgid "" "{color} did not match any used color name and was longer than six " @@ -5276,53 +5300,53 @@ msgstr "" "{color} stimmte mit keinem verwendeten Farbnamen überein und war länger als " "sechs Zeichen: ungültiges Hexadezimalzeichen." -#: netbox/dcim/forms/bulk_import.py:1594 netbox/dcim/forms/model_forms.py:926 +#: netbox/dcim/forms/bulk_import.py:1641 netbox/dcim/forms/model_forms.py:926 #: netbox/dcim/tables/devices.py:1144 #: netbox/templates/dcim/panels/virtual_chassis_members.html:10 msgid "Master" msgstr "Master" -#: netbox/dcim/forms/bulk_import.py:1598 +#: netbox/dcim/forms/bulk_import.py:1645 msgid "Master device" msgstr "Mastergerät" -#: netbox/dcim/forms/bulk_import.py:1615 +#: netbox/dcim/forms/bulk_import.py:1662 msgid "Name of parent site" msgstr "Name des übergeordneten Standorts" -#: netbox/dcim/forms/bulk_import.py:1649 +#: netbox/dcim/forms/bulk_import.py:1696 msgid "Upstream power panel" msgstr "vorgeschalteter Stromverteiler" -#: netbox/dcim/forms/bulk_import.py:1679 +#: netbox/dcim/forms/bulk_import.py:1726 msgid "Primary or redundant" msgstr "Primär oder redundant" -#: netbox/dcim/forms/bulk_import.py:1684 +#: netbox/dcim/forms/bulk_import.py:1731 msgid "Supply type (AC/DC)" msgstr "Versorgungsart (AC/DC)" -#: netbox/dcim/forms/bulk_import.py:1689 +#: netbox/dcim/forms/bulk_import.py:1736 msgid "Single or three-phase" msgstr "Ein- oder Dreiphasig" -#: netbox/dcim/forms/bulk_import.py:1739 netbox/dcim/forms/model_forms.py:1901 +#: netbox/dcim/forms/bulk_import.py:1786 netbox/dcim/forms/model_forms.py:1901 #: netbox/dcim/ui/panels.py:110 netbox/dcim/ui/panels.py:354 #: netbox/virtualization/ui/panels.py:28 msgid "Primary IPv4" msgstr "Primäre IPv4" -#: netbox/dcim/forms/bulk_import.py:1743 +#: netbox/dcim/forms/bulk_import.py:1790 msgid "IPv4 address with mask, e.g. 1.2.3.4/24" msgstr "IPv4-Adresse mit Maske, z. B. 1.2.3.4/24" -#: netbox/dcim/forms/bulk_import.py:1746 netbox/dcim/forms/model_forms.py:1910 +#: netbox/dcim/forms/bulk_import.py:1793 netbox/dcim/forms/model_forms.py:1910 #: netbox/dcim/ui/panels.py:115 netbox/dcim/ui/panels.py:359 #: netbox/virtualization/ui/panels.py:33 msgid "Primary IPv6" msgstr "Primäre IPv6" -#: netbox/dcim/forms/bulk_import.py:1750 +#: netbox/dcim/forms/bulk_import.py:1797 msgid "IPv6 address with prefix length, e.g. 2001:db8::1/64" msgstr "IPv6-Adresse mit Präfixlänge, z. B. 2001:db8: :1/64" @@ -10178,23 +10202,23 @@ msgstr "Abonnement" msgid "subscriptions" msgstr "Abonnements" -#: netbox/extras/models/scripts.py:43 +#: netbox/extras/models/scripts.py:41 msgid "is executable" msgstr "ist ausführbar" -#: netbox/extras/models/scripts.py:65 +#: netbox/extras/models/scripts.py:63 msgid "script" msgstr "Skript" -#: netbox/extras/models/scripts.py:66 +#: netbox/extras/models/scripts.py:64 msgid "scripts" msgstr "Skripte" -#: netbox/extras/models/scripts.py:112 +#: netbox/extras/models/scripts.py:110 msgid "script module" msgstr "Skriptmodul" -#: netbox/extras/models/scripts.py:113 +#: netbox/extras/models/scripts.py:111 msgid "script modules" msgstr "Skriptmodule" diff --git a/netbox/translations/es/LC_MESSAGES/django.mo b/netbox/translations/es/LC_MESSAGES/django.mo index 0d4eba8f9fb6be0c2f63d737a408945de4245cac..ce1a6abe5222b7582b4c91d7d2f48b1e86e45461 100644 GIT binary patch delta 73491 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

    UbdTMGZsMoV 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

    az!O@M-tkBP6TZ7=)XmkBZ0LT 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 diff --git a/netbox/translations/fr/LC_MESSAGES/django.po b/netbox/translations/fr/LC_MESSAGES/django.po index 5a74dc9f7..300eac7e4 100644 --- a/netbox/translations/fr/LC_MESSAGES/django.po +++ b/netbox/translations/fr/LC_MESSAGES/django.po @@ -23,7 +23,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-04-10 05:39+0000\n" +"POT-Creation-Date: 2026-04-14 05:39+0000\n" "PO-Revision-Date: 2023-10-30 17:48+0000\n" "Last-Translator: Jeremy Stretch, 2026\n" "Language-Team: French (https://app.transifex.com/netbox-community/teams/178115/fr/)\n" @@ -190,8 +190,8 @@ msgstr "Groupe de sites (slug)" #: netbox/dcim/forms/bulk_edit.py:329 netbox/dcim/forms/bulk_edit.py:679 #: netbox/dcim/forms/bulk_edit.py:866 netbox/dcim/forms/bulk_import.py:146 #: netbox/dcim/forms/bulk_import.py:247 netbox/dcim/forms/bulk_import.py:349 -#: netbox/dcim/forms/bulk_import.py:640 netbox/dcim/forms/bulk_import.py:1612 -#: netbox/dcim/forms/bulk_import.py:1640 netbox/dcim/forms/filtersets.py:106 +#: netbox/dcim/forms/bulk_import.py:640 netbox/dcim/forms/bulk_import.py:1659 +#: netbox/dcim/forms/bulk_import.py:1687 netbox/dcim/forms/filtersets.py:106 #: netbox/dcim/forms/filtersets.py:256 netbox/dcim/forms/filtersets.py:379 #: netbox/dcim/forms/filtersets.py:483 netbox/dcim/forms/filtersets.py:855 #: netbox/dcim/forms/filtersets.py:1073 netbox/dcim/forms/filtersets.py:1147 @@ -469,7 +469,7 @@ msgstr "Identifiant du service" #: netbox/dcim/forms/bulk_edit.py:611 netbox/dcim/forms/bulk_edit.py:809 #: netbox/dcim/forms/bulk_edit.py:1063 netbox/dcim/forms/bulk_edit.py:1162 #: netbox/dcim/forms/bulk_edit.py:1189 netbox/dcim/forms/bulk_edit.py:1723 -#: netbox/dcim/forms/bulk_import.py:1484 netbox/dcim/forms/filtersets.py:1220 +#: netbox/dcim/forms/bulk_import.py:1500 netbox/dcim/forms/filtersets.py:1220 #: netbox/dcim/forms/filtersets.py:1545 netbox/dcim/forms/filtersets.py:1761 #: netbox/dcim/forms/filtersets.py:1780 netbox/dcim/forms/filtersets.py:1804 #: netbox/dcim/forms/filtersets.py:1823 netbox/dcim/tables/devices.py:806 @@ -501,8 +501,8 @@ msgstr "Couleur" #: netbox/dcim/forms/bulk_import.py:813 netbox/dcim/forms/bulk_import.py:839 #: netbox/dcim/forms/bulk_import.py:865 netbox/dcim/forms/bulk_import.py:886 #: netbox/dcim/forms/bulk_import.py:972 netbox/dcim/forms/bulk_import.py:1101 -#: netbox/dcim/forms/bulk_import.py:1120 netbox/dcim/forms/bulk_import.py:1465 -#: netbox/dcim/forms/bulk_import.py:1677 netbox/dcim/forms/filtersets.py:1104 +#: netbox/dcim/forms/bulk_import.py:1120 netbox/dcim/forms/bulk_import.py:1481 +#: netbox/dcim/forms/bulk_import.py:1724 netbox/dcim/forms/filtersets.py:1104 #: netbox/dcim/forms/filtersets.py:1205 netbox/dcim/forms/filtersets.py:1333 #: netbox/dcim/forms/filtersets.py:1424 netbox/dcim/forms/filtersets.py:1444 #: netbox/dcim/forms/filtersets.py:1464 netbox/dcim/forms/filtersets.py:1484 @@ -560,8 +560,8 @@ msgstr "Identifiant de compte du prestataire" #: netbox/dcim/forms/bulk_import.py:103 netbox/dcim/forms/bulk_import.py:162 #: netbox/dcim/forms/bulk_import.py:265 netbox/dcim/forms/bulk_import.py:374 #: netbox/dcim/forms/bulk_import.py:605 netbox/dcim/forms/bulk_import.py:765 -#: netbox/dcim/forms/bulk_import.py:1230 netbox/dcim/forms/bulk_import.py:1453 -#: netbox/dcim/forms/bulk_import.py:1672 netbox/dcim/forms/bulk_import.py:1735 +#: netbox/dcim/forms/bulk_import.py:1230 netbox/dcim/forms/bulk_import.py:1469 +#: netbox/dcim/forms/bulk_import.py:1719 netbox/dcim/forms/bulk_import.py:1782 #: netbox/dcim/forms/filtersets.py:208 netbox/dcim/forms/filtersets.py:268 #: netbox/dcim/forms/filtersets.py:396 netbox/dcim/forms/filtersets.py:504 #: netbox/dcim/forms/filtersets.py:901 netbox/dcim/forms/filtersets.py:1024 @@ -622,8 +622,8 @@ msgstr "Statut" #: netbox/dcim/forms/bulk_edit.py:799 netbox/dcim/forms/bulk_edit.py:1746 #: netbox/dcim/forms/bulk_import.py:122 netbox/dcim/forms/bulk_import.py:167 #: netbox/dcim/forms/bulk_import.py:258 netbox/dcim/forms/bulk_import.py:379 -#: netbox/dcim/forms/bulk_import.py:579 netbox/dcim/forms/bulk_import.py:1471 -#: netbox/dcim/forms/bulk_import.py:1728 netbox/dcim/forms/filtersets.py:143 +#: netbox/dcim/forms/bulk_import.py:579 netbox/dcim/forms/bulk_import.py:1487 +#: netbox/dcim/forms/bulk_import.py:1775 netbox/dcim/forms/filtersets.py:143 #: netbox/dcim/forms/filtersets.py:202 netbox/dcim/forms/filtersets.py:235 #: netbox/dcim/forms/filtersets.py:363 netbox/dcim/forms/filtersets.py:442 #: netbox/dcim/forms/filtersets.py:463 netbox/dcim/forms/filtersets.py:823 @@ -809,7 +809,7 @@ msgstr "Description" #: netbox/circuits/forms/bulk_edit.py:192 #: netbox/circuits/forms/model_forms.py:199 -#: netbox/dcim/forms/bulk_import.py:1419 netbox/dcim/forms/bulk_import.py:1444 +#: netbox/dcim/forms/bulk_import.py:1427 netbox/dcim/forms/bulk_import.py:1460 msgid "Termination type" msgstr "Type de terminaison" @@ -939,7 +939,7 @@ msgstr "Type de circuit" #: netbox/dcim/forms/bulk_import.py:105 netbox/dcim/forms/bulk_import.py:164 #: netbox/dcim/forms/bulk_import.py:267 netbox/dcim/forms/bulk_import.py:376 #: netbox/dcim/forms/bulk_import.py:607 netbox/dcim/forms/bulk_import.py:767 -#: netbox/dcim/forms/bulk_import.py:1232 netbox/dcim/forms/bulk_import.py:1674 +#: netbox/dcim/forms/bulk_import.py:1232 netbox/dcim/forms/bulk_import.py:1721 #: netbox/ipam/forms/bulk_import.py:200 netbox/ipam/forms/bulk_import.py:264 #: netbox/ipam/forms/bulk_import.py:300 netbox/ipam/forms/bulk_import.py:531 #: netbox/ipam/forms/bulk_import.py:544 @@ -955,8 +955,8 @@ msgstr "État opérationnel" #: netbox/circuits/forms/bulk_import.py:235 #: netbox/dcim/forms/bulk_import.py:126 netbox/dcim/forms/bulk_import.py:171 #: netbox/dcim/forms/bulk_import.py:383 netbox/dcim/forms/bulk_import.py:583 -#: netbox/dcim/forms/bulk_import.py:1475 netbox/dcim/forms/bulk_import.py:1669 -#: netbox/dcim/forms/bulk_import.py:1732 netbox/ipam/forms/bulk_import.py:49 +#: netbox/dcim/forms/bulk_import.py:1491 netbox/dcim/forms/bulk_import.py:1716 +#: netbox/dcim/forms/bulk_import.py:1779 netbox/ipam/forms/bulk_import.py:49 #: netbox/ipam/forms/bulk_import.py:78 netbox/ipam/forms/bulk_import.py:106 #: netbox/ipam/forms/bulk_import.py:126 netbox/ipam/forms/bulk_import.py:146 #: netbox/ipam/forms/bulk_import.py:174 netbox/ipam/forms/bulk_import.py:259 @@ -1029,8 +1029,8 @@ msgstr "Interface" #: netbox/dcim/forms/bulk_edit.py:445 netbox/dcim/forms/bulk_edit.py:684 #: netbox/dcim/forms/bulk_edit.py:733 netbox/dcim/forms/bulk_edit.py:875 #: netbox/dcim/forms/bulk_import.py:252 netbox/dcim/forms/bulk_import.py:355 -#: netbox/dcim/forms/bulk_import.py:646 netbox/dcim/forms/bulk_import.py:1618 -#: netbox/dcim/forms/bulk_import.py:1652 netbox/dcim/forms/filtersets.py:114 +#: netbox/dcim/forms/bulk_import.py:646 netbox/dcim/forms/bulk_import.py:1665 +#: netbox/dcim/forms/bulk_import.py:1699 netbox/dcim/forms/filtersets.py:114 #: netbox/dcim/forms/filtersets.py:358 netbox/dcim/forms/filtersets.py:393 #: netbox/dcim/forms/filtersets.py:438 netbox/dcim/forms/filtersets.py:491 #: netbox/dcim/forms/filtersets.py:820 netbox/dcim/forms/filtersets.py:864 @@ -1458,7 +1458,7 @@ msgstr "" #: netbox/extras/models/models.py:417 netbox/extras/models/models.py:482 #: netbox/extras/models/models.py:567 netbox/extras/models/models.py:692 #: netbox/extras/models/notifications.py:126 -#: netbox/extras/models/scripts.py:31 netbox/ipam/models/asns.py:18 +#: netbox/extras/models/scripts.py:29 netbox/ipam/models/asns.py:18 #: netbox/ipam/models/fhrp.py:24 netbox/ipam/models/services.py:51 #: netbox/ipam/models/services.py:80 netbox/ipam/models/vlans.py:38 #: netbox/ipam/models/vlans.py:217 netbox/ipam/models/vlans.py:363 @@ -1703,7 +1703,7 @@ msgstr "Terminaisons" #: netbox/dcim/forms/bulk_import.py:1096 netbox/dcim/forms/bulk_import.py:1115 #: netbox/dcim/forms/bulk_import.py:1134 netbox/dcim/forms/bulk_import.py:1146 #: netbox/dcim/forms/bulk_import.py:1194 netbox/dcim/forms/bulk_import.py:1316 -#: netbox/dcim/forms/bulk_import.py:1722 netbox/dcim/forms/connections.py:34 +#: netbox/dcim/forms/bulk_import.py:1769 netbox/dcim/forms/connections.py:34 #: netbox/dcim/forms/filtersets.py:156 netbox/dcim/forms/filtersets.py:1021 #: netbox/dcim/forms/filtersets.py:1054 netbox/dcim/forms/filtersets.py:1202 #: netbox/dcim/forms/filtersets.py:1418 netbox/dcim/forms/filtersets.py:1441 @@ -4326,8 +4326,8 @@ msgstr "Flux d'air" #: netbox/dcim/forms/bulk_edit.py:444 netbox/dcim/forms/bulk_edit.py:897 #: netbox/dcim/forms/bulk_import.py:362 netbox/dcim/forms/bulk_import.py:365 -#: netbox/dcim/forms/bulk_import.py:653 netbox/dcim/forms/bulk_import.py:1659 -#: netbox/dcim/forms/bulk_import.py:1663 netbox/dcim/forms/filtersets.py:123 +#: netbox/dcim/forms/bulk_import.py:653 netbox/dcim/forms/bulk_import.py:1706 +#: netbox/dcim/forms/bulk_import.py:1710 netbox/dcim/forms/filtersets.py:123 #: netbox/dcim/forms/filtersets.py:359 netbox/dcim/forms/filtersets.py:448 #: netbox/dcim/forms/filtersets.py:462 netbox/dcim/forms/filtersets.py:501 #: netbox/dcim/forms/filtersets.py:874 netbox/dcim/forms/filtersets.py:1086 @@ -4388,7 +4388,7 @@ msgstr "Schéma" #: netbox/dcim/forms/bulk_edit.py:555 netbox/dcim/forms/bulk_edit.py:562 #: netbox/dcim/forms/bulk_edit.py:793 netbox/dcim/forms/bulk_import.py:460 -#: netbox/dcim/forms/bulk_import.py:1459 netbox/dcim/forms/filtersets.py:690 +#: netbox/dcim/forms/bulk_import.py:1475 netbox/dcim/forms/filtersets.py:690 #: netbox/dcim/forms/filtersets.py:1215 netbox/dcim/forms/model_forms.py:444 #: netbox/dcim/forms/model_forms.py:457 netbox/dcim/tables/modules.py:43 #: netbox/extras/forms/filtersets.py:413 @@ -4513,8 +4513,8 @@ msgstr "Libellé" msgid "Length" msgstr "Longueur" -#: netbox/dcim/forms/bulk_edit.py:818 netbox/dcim/forms/bulk_import.py:1478 -#: netbox/dcim/forms/bulk_import.py:1481 netbox/dcim/forms/filtersets.py:1228 +#: netbox/dcim/forms/bulk_edit.py:818 netbox/dcim/forms/bulk_import.py:1494 +#: netbox/dcim/forms/bulk_import.py:1497 netbox/dcim/forms/filtersets.py:1228 msgid "Length unit" msgstr "Unité de longueur" @@ -4522,17 +4522,17 @@ msgstr "Unité de longueur" msgid "Domain" msgstr "Domaine" -#: netbox/dcim/forms/bulk_edit.py:892 netbox/dcim/forms/bulk_import.py:1646 +#: netbox/dcim/forms/bulk_edit.py:892 netbox/dcim/forms/bulk_import.py:1693 #: netbox/dcim/forms/filtersets.py:1316 netbox/dcim/forms/model_forms.py:891 msgid "Power panel" msgstr "panneau d'alimentation" -#: netbox/dcim/forms/bulk_edit.py:914 netbox/dcim/forms/bulk_import.py:1682 +#: netbox/dcim/forms/bulk_edit.py:914 netbox/dcim/forms/bulk_import.py:1729 #: netbox/dcim/forms/filtersets.py:1338 msgid "Supply" msgstr "Approvisionnement" -#: netbox/dcim/forms/bulk_edit.py:920 netbox/dcim/forms/bulk_import.py:1687 +#: netbox/dcim/forms/bulk_edit.py:920 netbox/dcim/forms/bulk_import.py:1734 #: netbox/dcim/forms/filtersets.py:1343 msgid "Phase" msgstr "Phase" @@ -4764,7 +4764,7 @@ msgid "available options" msgstr "options disponibles" #: netbox/dcim/forms/bulk_import.py:149 netbox/dcim/forms/bulk_import.py:643 -#: netbox/dcim/forms/bulk_import.py:1643 netbox/ipam/forms/bulk_import.py:512 +#: netbox/dcim/forms/bulk_import.py:1690 netbox/ipam/forms/bulk_import.py:512 #: netbox/virtualization/forms/bulk_import.py:64 #: netbox/virtualization/forms/bulk_import.py:102 msgid "Assigned site" @@ -4827,7 +4827,7 @@ msgstr "La hauteur U doit être définie si aucun type de rack n'est spécifié. msgid "Parent site" msgstr "Site parent" -#: netbox/dcim/forms/bulk_import.py:359 netbox/dcim/forms/bulk_import.py:1656 +#: netbox/dcim/forms/bulk_import.py:359 netbox/dcim/forms/bulk_import.py:1703 msgid "Rack's location (if any)" msgstr "Emplacement de la baie (le cas échéant)" @@ -4895,7 +4895,7 @@ msgstr "Plateforme introuvable." msgid "Limit platform assignments to this manufacturer" msgstr "Limiter les affectations de plateforme à ce fabricant" -#: netbox/dcim/forms/bulk_import.py:576 netbox/dcim/forms/bulk_import.py:1725 +#: netbox/dcim/forms/bulk_import.py:576 netbox/dcim/forms/bulk_import.py:1772 #: netbox/tenancy/forms/bulk_import.py:116 msgid "Assigned role" msgstr "Rôle attribué" @@ -5105,7 +5105,7 @@ msgid "VDC {vdc} is not assigned to device {device}" msgstr "VDC {vdc} n'est pas attribué à l'appareil {device}" #: netbox/dcim/forms/bulk_import.py:1103 netbox/dcim/forms/bulk_import.py:1121 -#: netbox/dcim/forms/bulk_import.py:1468 +#: netbox/dcim/forms/bulk_import.py:1484 msgid "Physical medium classification" msgstr "Classification des supports physiques" @@ -5208,70 +5208,93 @@ msgstr "Site de l'appareil parent A (le cas échéant)" msgid "Side A device" msgstr "Appareil côté A" -#: netbox/dcim/forms/bulk_import.py:1413 netbox/dcim/forms/bulk_import.py:1438 -msgid "Device name" -msgstr "Nom de l'appareil" +#: netbox/dcim/forms/bulk_import.py:1414 netbox/dcim/forms/bulk_import.py:1447 +msgid "Device name (for device component terminations)" +msgstr "" -#: netbox/dcim/forms/bulk_import.py:1416 +#: netbox/dcim/forms/bulk_import.py:1417 +msgid "Side A power panel" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1421 netbox/dcim/forms/bulk_import.py:1454 +msgid "Power panel name (for power feed terminations)" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1424 msgid "Side A type" msgstr "Côté A type" -#: netbox/dcim/forms/bulk_import.py:1422 +#: netbox/dcim/forms/bulk_import.py:1430 msgid "Side A name" msgstr "Nom de la face A" -#: netbox/dcim/forms/bulk_import.py:1423 netbox/dcim/forms/bulk_import.py:1448 +#: netbox/dcim/forms/bulk_import.py:1431 netbox/dcim/forms/bulk_import.py:1464 msgid "Termination name" msgstr "Nom de terminaison" -#: netbox/dcim/forms/bulk_import.py:1428 +#: netbox/dcim/forms/bulk_import.py:1436 msgid "Side B site" msgstr "Site de la face B" -#: netbox/dcim/forms/bulk_import.py:1432 +#: netbox/dcim/forms/bulk_import.py:1440 #: netbox/wireless/forms/bulk_import.py:114 msgid "Site of parent device B (if any)" msgstr "Site de l'appareil parent B (le cas échéant)" -#: netbox/dcim/forms/bulk_import.py:1435 +#: netbox/dcim/forms/bulk_import.py:1443 msgid "Side B device" msgstr "Appareil Side B" -#: netbox/dcim/forms/bulk_import.py:1441 +#: netbox/dcim/forms/bulk_import.py:1450 +msgid "Side B power panel" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1457 msgid "Side B type" msgstr "Type de face B" -#: netbox/dcim/forms/bulk_import.py:1447 +#: netbox/dcim/forms/bulk_import.py:1463 msgid "Side B name" msgstr "Nom de la face B" -#: netbox/dcim/forms/bulk_import.py:1456 +#: netbox/dcim/forms/bulk_import.py:1472 #: netbox/templates/dcim/panels/connection.html:60 #: netbox/wireless/forms/bulk_import.py:133 msgid "Connection status" msgstr "État de la connexion" -#: netbox/dcim/forms/bulk_import.py:1462 +#: netbox/dcim/forms/bulk_import.py:1478 msgid "Cable connection profile" msgstr "Profil de connexion des câbles" -#: netbox/dcim/forms/bulk_import.py:1487 +#: netbox/dcim/forms/bulk_import.py:1503 msgid "Color name (e.g. \"Red\") or hex code (e.g. \"f44336\")" msgstr "" "Nom de la couleur (par exemple « Rouge ») ou code hexadécimal (par exemple " "« f44336 »)" -#: netbox/dcim/forms/bulk_import.py:1542 +#: netbox/dcim/forms/bulk_import.py:1564 +#, python-brace-format +msgid "" +"Side {side_upper}: {power_panel} {termination_object} is already connected" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1570 +#, python-brace-format +msgid "{side_upper} side termination not found: {power_panel} {name}" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1588 #, python-brace-format msgid "Side {side_upper}: {device} {termination_object} is already connected" msgstr "Côté {side_upper}: {device} {termination_object} est déjà connecté" -#: netbox/dcim/forms/bulk_import.py:1548 +#: netbox/dcim/forms/bulk_import.py:1594 #, python-brace-format msgid "{side_upper} side termination not found: {device} {name}" msgstr "{side_upper} terminaison latérale introuvable : {device} {name}" -#: netbox/dcim/forms/bulk_import.py:1569 +#: netbox/dcim/forms/bulk_import.py:1616 #, python-brace-format msgid "" "{color} did not match any used color name and was longer than six " @@ -5280,53 +5303,53 @@ msgstr "" "{color} ne correspondait à aucun nom de couleur utilisé et comportait plus " "de six caractères : hexadécimal non valide." -#: netbox/dcim/forms/bulk_import.py:1594 netbox/dcim/forms/model_forms.py:926 +#: netbox/dcim/forms/bulk_import.py:1641 netbox/dcim/forms/model_forms.py:926 #: netbox/dcim/tables/devices.py:1144 #: netbox/templates/dcim/panels/virtual_chassis_members.html:10 msgid "Master" msgstr "Maître" -#: netbox/dcim/forms/bulk_import.py:1598 +#: netbox/dcim/forms/bulk_import.py:1645 msgid "Master device" msgstr "Appareil principal" -#: netbox/dcim/forms/bulk_import.py:1615 +#: netbox/dcim/forms/bulk_import.py:1662 msgid "Name of parent site" msgstr "Nom du site parent" -#: netbox/dcim/forms/bulk_import.py:1649 +#: netbox/dcim/forms/bulk_import.py:1696 msgid "Upstream power panel" msgstr "Panneau d'alimentation en amont" -#: netbox/dcim/forms/bulk_import.py:1679 +#: netbox/dcim/forms/bulk_import.py:1726 msgid "Primary or redundant" msgstr "Principal ou redondant" -#: netbox/dcim/forms/bulk_import.py:1684 +#: netbox/dcim/forms/bulk_import.py:1731 msgid "Supply type (AC/DC)" msgstr "Type d'alimentation (AC/DC)" -#: netbox/dcim/forms/bulk_import.py:1689 +#: netbox/dcim/forms/bulk_import.py:1736 msgid "Single or three-phase" msgstr "Monophasé ou triphasé" -#: netbox/dcim/forms/bulk_import.py:1739 netbox/dcim/forms/model_forms.py:1901 +#: netbox/dcim/forms/bulk_import.py:1786 netbox/dcim/forms/model_forms.py:1901 #: netbox/dcim/ui/panels.py:110 netbox/dcim/ui/panels.py:354 #: netbox/virtualization/ui/panels.py:28 msgid "Primary IPv4" msgstr "IPv4 principal" -#: netbox/dcim/forms/bulk_import.py:1743 +#: netbox/dcim/forms/bulk_import.py:1790 msgid "IPv4 address with mask, e.g. 1.2.3.4/24" msgstr "Adresse IPv4 avec masque, par exemple 1.2.3.4/24" -#: netbox/dcim/forms/bulk_import.py:1746 netbox/dcim/forms/model_forms.py:1910 +#: netbox/dcim/forms/bulk_import.py:1793 netbox/dcim/forms/model_forms.py:1910 #: netbox/dcim/ui/panels.py:115 netbox/dcim/ui/panels.py:359 #: netbox/virtualization/ui/panels.py:33 msgid "Primary IPv6" msgstr "IPv6 principal" -#: netbox/dcim/forms/bulk_import.py:1750 +#: netbox/dcim/forms/bulk_import.py:1797 msgid "IPv6 address with prefix length, e.g. 2001:db8::1/64" msgstr "Adresse IPv6 avec longueur de préfixe, par exemple 2001:db8 : :1/64" @@ -10160,23 +10183,23 @@ msgstr "abonnement" msgid "subscriptions" msgstr "abonnements" -#: netbox/extras/models/scripts.py:43 +#: netbox/extras/models/scripts.py:41 msgid "is executable" msgstr "est exécutable" -#: netbox/extras/models/scripts.py:65 +#: netbox/extras/models/scripts.py:63 msgid "script" msgstr "script" -#: netbox/extras/models/scripts.py:66 +#: netbox/extras/models/scripts.py:64 msgid "scripts" msgstr "scripts" -#: netbox/extras/models/scripts.py:112 +#: netbox/extras/models/scripts.py:110 msgid "script module" msgstr "module de script" -#: netbox/extras/models/scripts.py:113 +#: netbox/extras/models/scripts.py:111 msgid "script modules" msgstr "modules de script" diff --git a/netbox/translations/it/LC_MESSAGES/django.mo b/netbox/translations/it/LC_MESSAGES/django.mo index 086c97a794e0ba7bac1a80ed4dd575cafca799c9..1c1b93e0c9d5ca8f4df6804e14c66b709c0dbb55 100644 GIT binary patch delta 73460 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 delta 73526 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 qGc8Q+`?OKz=Qpjgzn~euee1 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 bqPu@!=gxs$0|UE{EO9H;wi35|-v<02yPMXp diff --git a/netbox/translations/nl/LC_MESSAGES/django.po b/netbox/translations/nl/LC_MESSAGES/django.po index e38359d9e..2f73c84a1 100644 --- a/netbox/translations/nl/LC_MESSAGES/django.po +++ b/netbox/translations/nl/LC_MESSAGES/django.po @@ -16,7 +16,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-04-10 05:39+0000\n" +"POT-Creation-Date: 2026-04-14 05:39+0000\n" "PO-Revision-Date: 2023-10-30 17:48+0000\n" "Last-Translator: Jeremy Stretch, 2026\n" "Language-Team: Dutch (https://app.transifex.com/netbox-community/teams/178115/nl/)\n" @@ -183,8 +183,8 @@ msgstr "Sitegroep (slug)" #: netbox/dcim/forms/bulk_edit.py:329 netbox/dcim/forms/bulk_edit.py:679 #: netbox/dcim/forms/bulk_edit.py:866 netbox/dcim/forms/bulk_import.py:146 #: netbox/dcim/forms/bulk_import.py:247 netbox/dcim/forms/bulk_import.py:349 -#: netbox/dcim/forms/bulk_import.py:640 netbox/dcim/forms/bulk_import.py:1612 -#: netbox/dcim/forms/bulk_import.py:1640 netbox/dcim/forms/filtersets.py:106 +#: netbox/dcim/forms/bulk_import.py:640 netbox/dcim/forms/bulk_import.py:1659 +#: netbox/dcim/forms/bulk_import.py:1687 netbox/dcim/forms/filtersets.py:106 #: netbox/dcim/forms/filtersets.py:256 netbox/dcim/forms/filtersets.py:379 #: netbox/dcim/forms/filtersets.py:483 netbox/dcim/forms/filtersets.py:855 #: netbox/dcim/forms/filtersets.py:1073 netbox/dcim/forms/filtersets.py:1147 @@ -462,7 +462,7 @@ msgstr "Service-ID" #: netbox/dcim/forms/bulk_edit.py:611 netbox/dcim/forms/bulk_edit.py:809 #: netbox/dcim/forms/bulk_edit.py:1063 netbox/dcim/forms/bulk_edit.py:1162 #: netbox/dcim/forms/bulk_edit.py:1189 netbox/dcim/forms/bulk_edit.py:1723 -#: netbox/dcim/forms/bulk_import.py:1484 netbox/dcim/forms/filtersets.py:1220 +#: netbox/dcim/forms/bulk_import.py:1500 netbox/dcim/forms/filtersets.py:1220 #: netbox/dcim/forms/filtersets.py:1545 netbox/dcim/forms/filtersets.py:1761 #: netbox/dcim/forms/filtersets.py:1780 netbox/dcim/forms/filtersets.py:1804 #: netbox/dcim/forms/filtersets.py:1823 netbox/dcim/tables/devices.py:806 @@ -494,8 +494,8 @@ msgstr "Kleur" #: netbox/dcim/forms/bulk_import.py:813 netbox/dcim/forms/bulk_import.py:839 #: netbox/dcim/forms/bulk_import.py:865 netbox/dcim/forms/bulk_import.py:886 #: netbox/dcim/forms/bulk_import.py:972 netbox/dcim/forms/bulk_import.py:1101 -#: netbox/dcim/forms/bulk_import.py:1120 netbox/dcim/forms/bulk_import.py:1465 -#: netbox/dcim/forms/bulk_import.py:1677 netbox/dcim/forms/filtersets.py:1104 +#: netbox/dcim/forms/bulk_import.py:1120 netbox/dcim/forms/bulk_import.py:1481 +#: netbox/dcim/forms/bulk_import.py:1724 netbox/dcim/forms/filtersets.py:1104 #: netbox/dcim/forms/filtersets.py:1205 netbox/dcim/forms/filtersets.py:1333 #: netbox/dcim/forms/filtersets.py:1424 netbox/dcim/forms/filtersets.py:1444 #: netbox/dcim/forms/filtersets.py:1464 netbox/dcim/forms/filtersets.py:1484 @@ -553,8 +553,8 @@ msgstr "Provideraccount" #: netbox/dcim/forms/bulk_import.py:103 netbox/dcim/forms/bulk_import.py:162 #: netbox/dcim/forms/bulk_import.py:265 netbox/dcim/forms/bulk_import.py:374 #: netbox/dcim/forms/bulk_import.py:605 netbox/dcim/forms/bulk_import.py:765 -#: netbox/dcim/forms/bulk_import.py:1230 netbox/dcim/forms/bulk_import.py:1453 -#: netbox/dcim/forms/bulk_import.py:1672 netbox/dcim/forms/bulk_import.py:1735 +#: netbox/dcim/forms/bulk_import.py:1230 netbox/dcim/forms/bulk_import.py:1469 +#: netbox/dcim/forms/bulk_import.py:1719 netbox/dcim/forms/bulk_import.py:1782 #: netbox/dcim/forms/filtersets.py:208 netbox/dcim/forms/filtersets.py:268 #: netbox/dcim/forms/filtersets.py:396 netbox/dcim/forms/filtersets.py:504 #: netbox/dcim/forms/filtersets.py:901 netbox/dcim/forms/filtersets.py:1024 @@ -615,8 +615,8 @@ msgstr "Status" #: netbox/dcim/forms/bulk_edit.py:799 netbox/dcim/forms/bulk_edit.py:1746 #: netbox/dcim/forms/bulk_import.py:122 netbox/dcim/forms/bulk_import.py:167 #: netbox/dcim/forms/bulk_import.py:258 netbox/dcim/forms/bulk_import.py:379 -#: netbox/dcim/forms/bulk_import.py:579 netbox/dcim/forms/bulk_import.py:1471 -#: netbox/dcim/forms/bulk_import.py:1728 netbox/dcim/forms/filtersets.py:143 +#: netbox/dcim/forms/bulk_import.py:579 netbox/dcim/forms/bulk_import.py:1487 +#: netbox/dcim/forms/bulk_import.py:1775 netbox/dcim/forms/filtersets.py:143 #: netbox/dcim/forms/filtersets.py:202 netbox/dcim/forms/filtersets.py:235 #: netbox/dcim/forms/filtersets.py:363 netbox/dcim/forms/filtersets.py:442 #: netbox/dcim/forms/filtersets.py:463 netbox/dcim/forms/filtersets.py:823 @@ -802,7 +802,7 @@ msgstr "Omschrijving" #: netbox/circuits/forms/bulk_edit.py:192 #: netbox/circuits/forms/model_forms.py:199 -#: netbox/dcim/forms/bulk_import.py:1419 netbox/dcim/forms/bulk_import.py:1444 +#: netbox/dcim/forms/bulk_import.py:1427 netbox/dcim/forms/bulk_import.py:1460 msgid "Termination type" msgstr "Soort beëindiging" @@ -932,7 +932,7 @@ msgstr "Soort circuit" #: netbox/dcim/forms/bulk_import.py:105 netbox/dcim/forms/bulk_import.py:164 #: netbox/dcim/forms/bulk_import.py:267 netbox/dcim/forms/bulk_import.py:376 #: netbox/dcim/forms/bulk_import.py:607 netbox/dcim/forms/bulk_import.py:767 -#: netbox/dcim/forms/bulk_import.py:1232 netbox/dcim/forms/bulk_import.py:1674 +#: netbox/dcim/forms/bulk_import.py:1232 netbox/dcim/forms/bulk_import.py:1721 #: netbox/ipam/forms/bulk_import.py:200 netbox/ipam/forms/bulk_import.py:264 #: netbox/ipam/forms/bulk_import.py:300 netbox/ipam/forms/bulk_import.py:531 #: netbox/ipam/forms/bulk_import.py:544 @@ -948,8 +948,8 @@ msgstr "Operationele status" #: netbox/circuits/forms/bulk_import.py:235 #: netbox/dcim/forms/bulk_import.py:126 netbox/dcim/forms/bulk_import.py:171 #: netbox/dcim/forms/bulk_import.py:383 netbox/dcim/forms/bulk_import.py:583 -#: netbox/dcim/forms/bulk_import.py:1475 netbox/dcim/forms/bulk_import.py:1669 -#: netbox/dcim/forms/bulk_import.py:1732 netbox/ipam/forms/bulk_import.py:49 +#: netbox/dcim/forms/bulk_import.py:1491 netbox/dcim/forms/bulk_import.py:1716 +#: netbox/dcim/forms/bulk_import.py:1779 netbox/ipam/forms/bulk_import.py:49 #: netbox/ipam/forms/bulk_import.py:78 netbox/ipam/forms/bulk_import.py:106 #: netbox/ipam/forms/bulk_import.py:126 netbox/ipam/forms/bulk_import.py:146 #: netbox/ipam/forms/bulk_import.py:174 netbox/ipam/forms/bulk_import.py:259 @@ -1022,8 +1022,8 @@ msgstr "Interface" #: netbox/dcim/forms/bulk_edit.py:445 netbox/dcim/forms/bulk_edit.py:684 #: netbox/dcim/forms/bulk_edit.py:733 netbox/dcim/forms/bulk_edit.py:875 #: netbox/dcim/forms/bulk_import.py:252 netbox/dcim/forms/bulk_import.py:355 -#: netbox/dcim/forms/bulk_import.py:646 netbox/dcim/forms/bulk_import.py:1618 -#: netbox/dcim/forms/bulk_import.py:1652 netbox/dcim/forms/filtersets.py:114 +#: netbox/dcim/forms/bulk_import.py:646 netbox/dcim/forms/bulk_import.py:1665 +#: netbox/dcim/forms/bulk_import.py:1699 netbox/dcim/forms/filtersets.py:114 #: netbox/dcim/forms/filtersets.py:358 netbox/dcim/forms/filtersets.py:393 #: netbox/dcim/forms/filtersets.py:438 netbox/dcim/forms/filtersets.py:491 #: netbox/dcim/forms/filtersets.py:820 netbox/dcim/forms/filtersets.py:864 @@ -1451,7 +1451,7 @@ msgstr "" #: netbox/extras/models/models.py:417 netbox/extras/models/models.py:482 #: netbox/extras/models/models.py:567 netbox/extras/models/models.py:692 #: netbox/extras/models/notifications.py:126 -#: netbox/extras/models/scripts.py:31 netbox/ipam/models/asns.py:18 +#: netbox/extras/models/scripts.py:29 netbox/ipam/models/asns.py:18 #: netbox/ipam/models/fhrp.py:24 netbox/ipam/models/services.py:51 #: netbox/ipam/models/services.py:80 netbox/ipam/models/vlans.py:38 #: netbox/ipam/models/vlans.py:217 netbox/ipam/models/vlans.py:363 @@ -1696,7 +1696,7 @@ msgstr "Beëindigingen" #: netbox/dcim/forms/bulk_import.py:1096 netbox/dcim/forms/bulk_import.py:1115 #: netbox/dcim/forms/bulk_import.py:1134 netbox/dcim/forms/bulk_import.py:1146 #: netbox/dcim/forms/bulk_import.py:1194 netbox/dcim/forms/bulk_import.py:1316 -#: netbox/dcim/forms/bulk_import.py:1722 netbox/dcim/forms/connections.py:34 +#: netbox/dcim/forms/bulk_import.py:1769 netbox/dcim/forms/connections.py:34 #: netbox/dcim/forms/filtersets.py:156 netbox/dcim/forms/filtersets.py:1021 #: netbox/dcim/forms/filtersets.py:1054 netbox/dcim/forms/filtersets.py:1202 #: netbox/dcim/forms/filtersets.py:1418 netbox/dcim/forms/filtersets.py:1441 @@ -4315,8 +4315,8 @@ msgstr "Luchtstroom" #: netbox/dcim/forms/bulk_edit.py:444 netbox/dcim/forms/bulk_edit.py:897 #: netbox/dcim/forms/bulk_import.py:362 netbox/dcim/forms/bulk_import.py:365 -#: netbox/dcim/forms/bulk_import.py:653 netbox/dcim/forms/bulk_import.py:1659 -#: netbox/dcim/forms/bulk_import.py:1663 netbox/dcim/forms/filtersets.py:123 +#: netbox/dcim/forms/bulk_import.py:653 netbox/dcim/forms/bulk_import.py:1706 +#: netbox/dcim/forms/bulk_import.py:1710 netbox/dcim/forms/filtersets.py:123 #: netbox/dcim/forms/filtersets.py:359 netbox/dcim/forms/filtersets.py:448 #: netbox/dcim/forms/filtersets.py:462 netbox/dcim/forms/filtersets.py:501 #: netbox/dcim/forms/filtersets.py:874 netbox/dcim/forms/filtersets.py:1086 @@ -4377,7 +4377,7 @@ msgstr "Schema" #: netbox/dcim/forms/bulk_edit.py:555 netbox/dcim/forms/bulk_edit.py:562 #: netbox/dcim/forms/bulk_edit.py:793 netbox/dcim/forms/bulk_import.py:460 -#: netbox/dcim/forms/bulk_import.py:1459 netbox/dcim/forms/filtersets.py:690 +#: netbox/dcim/forms/bulk_import.py:1475 netbox/dcim/forms/filtersets.py:690 #: netbox/dcim/forms/filtersets.py:1215 netbox/dcim/forms/model_forms.py:444 #: netbox/dcim/forms/model_forms.py:457 netbox/dcim/tables/modules.py:43 #: netbox/extras/forms/filtersets.py:413 @@ -4502,8 +4502,8 @@ msgstr "Label" msgid "Length" msgstr "Lengte" -#: netbox/dcim/forms/bulk_edit.py:818 netbox/dcim/forms/bulk_import.py:1478 -#: netbox/dcim/forms/bulk_import.py:1481 netbox/dcim/forms/filtersets.py:1228 +#: netbox/dcim/forms/bulk_edit.py:818 netbox/dcim/forms/bulk_import.py:1494 +#: netbox/dcim/forms/bulk_import.py:1497 netbox/dcim/forms/filtersets.py:1228 msgid "Length unit" msgstr "Lengte-eenheid" @@ -4511,17 +4511,17 @@ msgstr "Lengte-eenheid" msgid "Domain" msgstr "Domein" -#: netbox/dcim/forms/bulk_edit.py:892 netbox/dcim/forms/bulk_import.py:1646 +#: netbox/dcim/forms/bulk_edit.py:892 netbox/dcim/forms/bulk_import.py:1693 #: netbox/dcim/forms/filtersets.py:1316 netbox/dcim/forms/model_forms.py:891 msgid "Power panel" msgstr "Voedingspaneel" -#: netbox/dcim/forms/bulk_edit.py:914 netbox/dcim/forms/bulk_import.py:1682 +#: netbox/dcim/forms/bulk_edit.py:914 netbox/dcim/forms/bulk_import.py:1729 #: netbox/dcim/forms/filtersets.py:1338 msgid "Supply" msgstr "Levering" -#: netbox/dcim/forms/bulk_edit.py:920 netbox/dcim/forms/bulk_import.py:1687 +#: netbox/dcim/forms/bulk_edit.py:920 netbox/dcim/forms/bulk_import.py:1734 #: netbox/dcim/forms/filtersets.py:1343 msgid "Phase" msgstr "Fase" @@ -4753,7 +4753,7 @@ msgid "available options" msgstr "beschikbare opties" #: netbox/dcim/forms/bulk_import.py:149 netbox/dcim/forms/bulk_import.py:643 -#: netbox/dcim/forms/bulk_import.py:1643 netbox/ipam/forms/bulk_import.py:512 +#: netbox/dcim/forms/bulk_import.py:1690 netbox/ipam/forms/bulk_import.py:512 #: netbox/virtualization/forms/bulk_import.py:64 #: netbox/virtualization/forms/bulk_import.py:102 msgid "Assigned site" @@ -4818,7 +4818,7 @@ msgstr "" msgid "Parent site" msgstr "Site voor ouders" -#: netbox/dcim/forms/bulk_import.py:359 netbox/dcim/forms/bulk_import.py:1656 +#: netbox/dcim/forms/bulk_import.py:359 netbox/dcim/forms/bulk_import.py:1703 msgid "Rack's location (if any)" msgstr "Locatie van het rek (indien aanwezig)" @@ -4886,7 +4886,7 @@ msgstr "Platform niet gevonden." msgid "Limit platform assignments to this manufacturer" msgstr "Beperk de platformtoewijzingen aan deze fabrikant" -#: netbox/dcim/forms/bulk_import.py:576 netbox/dcim/forms/bulk_import.py:1725 +#: netbox/dcim/forms/bulk_import.py:576 netbox/dcim/forms/bulk_import.py:1772 #: netbox/tenancy/forms/bulk_import.py:116 msgid "Assigned role" msgstr "Toegewezen rol" @@ -5097,7 +5097,7 @@ msgid "VDC {vdc} is not assigned to device {device}" msgstr "VDC {vdc} is niet toegewezen aan het apparaat {device}" #: netbox/dcim/forms/bulk_import.py:1103 netbox/dcim/forms/bulk_import.py:1121 -#: netbox/dcim/forms/bulk_import.py:1468 +#: netbox/dcim/forms/bulk_import.py:1484 msgid "Physical medium classification" msgstr "Classificatie van fysieke media" @@ -5200,70 +5200,93 @@ msgstr "Site van ouderapparaat A (indien aanwezig)" msgid "Side A device" msgstr "Side A-apparaat" -#: netbox/dcim/forms/bulk_import.py:1413 netbox/dcim/forms/bulk_import.py:1438 -msgid "Device name" -msgstr "Naam van het apparaat" +#: netbox/dcim/forms/bulk_import.py:1414 netbox/dcim/forms/bulk_import.py:1447 +msgid "Device name (for device component terminations)" +msgstr "" -#: netbox/dcim/forms/bulk_import.py:1416 +#: netbox/dcim/forms/bulk_import.py:1417 +msgid "Side A power panel" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1421 netbox/dcim/forms/bulk_import.py:1454 +msgid "Power panel name (for power feed terminations)" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1424 msgid "Side A type" msgstr "Type kant A" -#: netbox/dcim/forms/bulk_import.py:1422 +#: netbox/dcim/forms/bulk_import.py:1430 msgid "Side A name" msgstr "Naam van kant A" -#: netbox/dcim/forms/bulk_import.py:1423 netbox/dcim/forms/bulk_import.py:1448 +#: netbox/dcim/forms/bulk_import.py:1431 netbox/dcim/forms/bulk_import.py:1464 msgid "Termination name" msgstr "Naam van beëindiging" -#: netbox/dcim/forms/bulk_import.py:1428 +#: netbox/dcim/forms/bulk_import.py:1436 msgid "Side B site" msgstr "Site aan kant B" -#: netbox/dcim/forms/bulk_import.py:1432 +#: netbox/dcim/forms/bulk_import.py:1440 #: netbox/wireless/forms/bulk_import.py:114 msgid "Site of parent device B (if any)" msgstr "Site van ouderapparaat B (indien aanwezig)" -#: netbox/dcim/forms/bulk_import.py:1435 +#: netbox/dcim/forms/bulk_import.py:1443 msgid "Side B device" msgstr "Side B-apparaat" -#: netbox/dcim/forms/bulk_import.py:1441 +#: netbox/dcim/forms/bulk_import.py:1450 +msgid "Side B power panel" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1457 msgid "Side B type" msgstr "Type kant B" -#: netbox/dcim/forms/bulk_import.py:1447 +#: netbox/dcim/forms/bulk_import.py:1463 msgid "Side B name" msgstr "Naam van kant B" -#: netbox/dcim/forms/bulk_import.py:1456 +#: netbox/dcim/forms/bulk_import.py:1472 #: netbox/templates/dcim/panels/connection.html:60 #: netbox/wireless/forms/bulk_import.py:133 msgid "Connection status" msgstr "Status van de verbinding" -#: netbox/dcim/forms/bulk_import.py:1462 +#: netbox/dcim/forms/bulk_import.py:1478 msgid "Cable connection profile" msgstr "Kabelaansluitprofiel" -#: netbox/dcim/forms/bulk_import.py:1487 +#: netbox/dcim/forms/bulk_import.py:1503 msgid "Color name (e.g. \"Red\") or hex code (e.g. \"f44336\")" msgstr "" "Kleurnaam (bijvoorbeeld „Rood”) of hexadecimale code (bijvoorbeeld " "„f44336\")" -#: netbox/dcim/forms/bulk_import.py:1542 +#: netbox/dcim/forms/bulk_import.py:1564 +#, python-brace-format +msgid "" +"Side {side_upper}: {power_panel} {termination_object} is already connected" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1570 +#, python-brace-format +msgid "{side_upper} side termination not found: {power_panel} {name}" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1588 #, python-brace-format msgid "Side {side_upper}: {device} {termination_object} is already connected" msgstr "Kant {side_upper}: {device} {termination_object} is al verbonden" -#: netbox/dcim/forms/bulk_import.py:1548 +#: netbox/dcim/forms/bulk_import.py:1594 #, python-brace-format msgid "{side_upper} side termination not found: {device} {name}" msgstr "{side_upper} nevenbeëindiging niet gevonden: {device} {name}" -#: netbox/dcim/forms/bulk_import.py:1569 +#: netbox/dcim/forms/bulk_import.py:1616 #, python-brace-format msgid "" "{color} did not match any used color name and was longer than six " @@ -5272,53 +5295,53 @@ msgstr "" "{color} kwam niet overeen met een gebruikte kleurnaam en bestond uit meer " "dan zes tekens: ongeldige hexadecimale waarde." -#: netbox/dcim/forms/bulk_import.py:1594 netbox/dcim/forms/model_forms.py:926 +#: netbox/dcim/forms/bulk_import.py:1641 netbox/dcim/forms/model_forms.py:926 #: netbox/dcim/tables/devices.py:1144 #: netbox/templates/dcim/panels/virtual_chassis_members.html:10 msgid "Master" msgstr "Meester" -#: netbox/dcim/forms/bulk_import.py:1598 +#: netbox/dcim/forms/bulk_import.py:1645 msgid "Master device" msgstr "Master-apparaat" -#: netbox/dcim/forms/bulk_import.py:1615 +#: netbox/dcim/forms/bulk_import.py:1662 msgid "Name of parent site" msgstr "Naam van de moedersite" -#: netbox/dcim/forms/bulk_import.py:1649 +#: netbox/dcim/forms/bulk_import.py:1696 msgid "Upstream power panel" msgstr "Stroomopwaarts stroompaneel" -#: netbox/dcim/forms/bulk_import.py:1679 +#: netbox/dcim/forms/bulk_import.py:1726 msgid "Primary or redundant" msgstr "Primair of redundant" -#: netbox/dcim/forms/bulk_import.py:1684 +#: netbox/dcim/forms/bulk_import.py:1731 msgid "Supply type (AC/DC)" msgstr "Soort voeding (AC/DC)" -#: netbox/dcim/forms/bulk_import.py:1689 +#: netbox/dcim/forms/bulk_import.py:1736 msgid "Single or three-phase" msgstr "Enkel- of driefasig" -#: netbox/dcim/forms/bulk_import.py:1739 netbox/dcim/forms/model_forms.py:1901 +#: netbox/dcim/forms/bulk_import.py:1786 netbox/dcim/forms/model_forms.py:1901 #: netbox/dcim/ui/panels.py:110 netbox/dcim/ui/panels.py:354 #: netbox/virtualization/ui/panels.py:28 msgid "Primary IPv4" msgstr "Primaire IPv4" -#: netbox/dcim/forms/bulk_import.py:1743 +#: netbox/dcim/forms/bulk_import.py:1790 msgid "IPv4 address with mask, e.g. 1.2.3.4/24" msgstr "IPv4-adres met masker, bijvoorbeeld 1.2.3.4/24" -#: netbox/dcim/forms/bulk_import.py:1746 netbox/dcim/forms/model_forms.py:1910 +#: netbox/dcim/forms/bulk_import.py:1793 netbox/dcim/forms/model_forms.py:1910 #: netbox/dcim/ui/panels.py:115 netbox/dcim/ui/panels.py:359 #: netbox/virtualization/ui/panels.py:33 msgid "Primary IPv6" msgstr "Primaire IPv6" -#: netbox/dcim/forms/bulk_import.py:1750 +#: netbox/dcim/forms/bulk_import.py:1797 msgid "IPv6 address with prefix length, e.g. 2001:db8::1/64" msgstr "IPv6-adres met prefixlengte, bijvoorbeeld 2001:db8: :1/64" @@ -10131,23 +10154,23 @@ msgstr "abonnement" msgid "subscriptions" msgstr "abonnementen" -#: netbox/extras/models/scripts.py:43 +#: netbox/extras/models/scripts.py:41 msgid "is executable" msgstr "is uitvoerbaar" -#: netbox/extras/models/scripts.py:65 +#: netbox/extras/models/scripts.py:63 msgid "script" msgstr "script" -#: netbox/extras/models/scripts.py:66 +#: netbox/extras/models/scripts.py:64 msgid "scripts" msgstr "scripts" -#: netbox/extras/models/scripts.py:112 +#: netbox/extras/models/scripts.py:110 msgid "script module" msgstr "scriptmodule" -#: netbox/extras/models/scripts.py:113 +#: netbox/extras/models/scripts.py:111 msgid "script modules" msgstr "scriptmodules" diff --git a/netbox/translations/pl/LC_MESSAGES/django.mo b/netbox/translations/pl/LC_MESSAGES/django.mo index 879b1eb25f0952bdf6c7499b9cb0c9a9980e1aaa..d0a4a344ffde1d7b92deb1777c93aab3bf698ce7 100644 GIT binary patch delta 73491 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 AD*ylh delta 73505 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

    Qz0wmcCDkK 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®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 delta 73525 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 N6KZ?YJHF>K{vSZs&guXF diff --git a/netbox/translations/pt/LC_MESSAGES/django.po b/netbox/translations/pt/LC_MESSAGES/django.po index ec05b05db..fadd9dd6d 100644 --- a/netbox/translations/pt/LC_MESSAGES/django.po +++ b/netbox/translations/pt/LC_MESSAGES/django.po @@ -14,7 +14,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-04-10 05:39+0000\n" +"POT-Creation-Date: 2026-04-14 05:39+0000\n" "PO-Revision-Date: 2023-10-30 17:48+0000\n" "Last-Translator: Jeremy Stretch, 2026\n" "Language-Team: Portuguese (https://app.transifex.com/netbox-community/teams/178115/pt/)\n" @@ -181,8 +181,8 @@ msgstr "Grupo de sites (slug)" #: netbox/dcim/forms/bulk_edit.py:329 netbox/dcim/forms/bulk_edit.py:679 #: netbox/dcim/forms/bulk_edit.py:866 netbox/dcim/forms/bulk_import.py:146 #: netbox/dcim/forms/bulk_import.py:247 netbox/dcim/forms/bulk_import.py:349 -#: netbox/dcim/forms/bulk_import.py:640 netbox/dcim/forms/bulk_import.py:1612 -#: netbox/dcim/forms/bulk_import.py:1640 netbox/dcim/forms/filtersets.py:106 +#: netbox/dcim/forms/bulk_import.py:640 netbox/dcim/forms/bulk_import.py:1659 +#: netbox/dcim/forms/bulk_import.py:1687 netbox/dcim/forms/filtersets.py:106 #: netbox/dcim/forms/filtersets.py:256 netbox/dcim/forms/filtersets.py:379 #: netbox/dcim/forms/filtersets.py:483 netbox/dcim/forms/filtersets.py:855 #: netbox/dcim/forms/filtersets.py:1073 netbox/dcim/forms/filtersets.py:1147 @@ -460,7 +460,7 @@ msgstr "ID do serviço" #: netbox/dcim/forms/bulk_edit.py:611 netbox/dcim/forms/bulk_edit.py:809 #: netbox/dcim/forms/bulk_edit.py:1063 netbox/dcim/forms/bulk_edit.py:1162 #: netbox/dcim/forms/bulk_edit.py:1189 netbox/dcim/forms/bulk_edit.py:1723 -#: netbox/dcim/forms/bulk_import.py:1484 netbox/dcim/forms/filtersets.py:1220 +#: netbox/dcim/forms/bulk_import.py:1500 netbox/dcim/forms/filtersets.py:1220 #: netbox/dcim/forms/filtersets.py:1545 netbox/dcim/forms/filtersets.py:1761 #: netbox/dcim/forms/filtersets.py:1780 netbox/dcim/forms/filtersets.py:1804 #: netbox/dcim/forms/filtersets.py:1823 netbox/dcim/tables/devices.py:806 @@ -492,8 +492,8 @@ msgstr "Cor" #: netbox/dcim/forms/bulk_import.py:813 netbox/dcim/forms/bulk_import.py:839 #: netbox/dcim/forms/bulk_import.py:865 netbox/dcim/forms/bulk_import.py:886 #: netbox/dcim/forms/bulk_import.py:972 netbox/dcim/forms/bulk_import.py:1101 -#: netbox/dcim/forms/bulk_import.py:1120 netbox/dcim/forms/bulk_import.py:1465 -#: netbox/dcim/forms/bulk_import.py:1677 netbox/dcim/forms/filtersets.py:1104 +#: netbox/dcim/forms/bulk_import.py:1120 netbox/dcim/forms/bulk_import.py:1481 +#: netbox/dcim/forms/bulk_import.py:1724 netbox/dcim/forms/filtersets.py:1104 #: netbox/dcim/forms/filtersets.py:1205 netbox/dcim/forms/filtersets.py:1333 #: netbox/dcim/forms/filtersets.py:1424 netbox/dcim/forms/filtersets.py:1444 #: netbox/dcim/forms/filtersets.py:1464 netbox/dcim/forms/filtersets.py:1484 @@ -551,8 +551,8 @@ msgstr "Conta do provedor" #: netbox/dcim/forms/bulk_import.py:103 netbox/dcim/forms/bulk_import.py:162 #: netbox/dcim/forms/bulk_import.py:265 netbox/dcim/forms/bulk_import.py:374 #: netbox/dcim/forms/bulk_import.py:605 netbox/dcim/forms/bulk_import.py:765 -#: netbox/dcim/forms/bulk_import.py:1230 netbox/dcim/forms/bulk_import.py:1453 -#: netbox/dcim/forms/bulk_import.py:1672 netbox/dcim/forms/bulk_import.py:1735 +#: netbox/dcim/forms/bulk_import.py:1230 netbox/dcim/forms/bulk_import.py:1469 +#: netbox/dcim/forms/bulk_import.py:1719 netbox/dcim/forms/bulk_import.py:1782 #: netbox/dcim/forms/filtersets.py:208 netbox/dcim/forms/filtersets.py:268 #: netbox/dcim/forms/filtersets.py:396 netbox/dcim/forms/filtersets.py:504 #: netbox/dcim/forms/filtersets.py:901 netbox/dcim/forms/filtersets.py:1024 @@ -613,8 +613,8 @@ msgstr "Status" #: netbox/dcim/forms/bulk_edit.py:799 netbox/dcim/forms/bulk_edit.py:1746 #: netbox/dcim/forms/bulk_import.py:122 netbox/dcim/forms/bulk_import.py:167 #: netbox/dcim/forms/bulk_import.py:258 netbox/dcim/forms/bulk_import.py:379 -#: netbox/dcim/forms/bulk_import.py:579 netbox/dcim/forms/bulk_import.py:1471 -#: netbox/dcim/forms/bulk_import.py:1728 netbox/dcim/forms/filtersets.py:143 +#: netbox/dcim/forms/bulk_import.py:579 netbox/dcim/forms/bulk_import.py:1487 +#: netbox/dcim/forms/bulk_import.py:1775 netbox/dcim/forms/filtersets.py:143 #: netbox/dcim/forms/filtersets.py:202 netbox/dcim/forms/filtersets.py:235 #: netbox/dcim/forms/filtersets.py:363 netbox/dcim/forms/filtersets.py:442 #: netbox/dcim/forms/filtersets.py:463 netbox/dcim/forms/filtersets.py:823 @@ -800,7 +800,7 @@ msgstr "Descrição" #: netbox/circuits/forms/bulk_edit.py:192 #: netbox/circuits/forms/model_forms.py:199 -#: netbox/dcim/forms/bulk_import.py:1419 netbox/dcim/forms/bulk_import.py:1444 +#: netbox/dcim/forms/bulk_import.py:1427 netbox/dcim/forms/bulk_import.py:1460 msgid "Termination type" msgstr "Tipo de terminação" @@ -930,7 +930,7 @@ msgstr "Tipo de circuito" #: netbox/dcim/forms/bulk_import.py:105 netbox/dcim/forms/bulk_import.py:164 #: netbox/dcim/forms/bulk_import.py:267 netbox/dcim/forms/bulk_import.py:376 #: netbox/dcim/forms/bulk_import.py:607 netbox/dcim/forms/bulk_import.py:767 -#: netbox/dcim/forms/bulk_import.py:1232 netbox/dcim/forms/bulk_import.py:1674 +#: netbox/dcim/forms/bulk_import.py:1232 netbox/dcim/forms/bulk_import.py:1721 #: netbox/ipam/forms/bulk_import.py:200 netbox/ipam/forms/bulk_import.py:264 #: netbox/ipam/forms/bulk_import.py:300 netbox/ipam/forms/bulk_import.py:531 #: netbox/ipam/forms/bulk_import.py:544 @@ -946,8 +946,8 @@ msgstr "Status operacional" #: netbox/circuits/forms/bulk_import.py:235 #: netbox/dcim/forms/bulk_import.py:126 netbox/dcim/forms/bulk_import.py:171 #: netbox/dcim/forms/bulk_import.py:383 netbox/dcim/forms/bulk_import.py:583 -#: netbox/dcim/forms/bulk_import.py:1475 netbox/dcim/forms/bulk_import.py:1669 -#: netbox/dcim/forms/bulk_import.py:1732 netbox/ipam/forms/bulk_import.py:49 +#: netbox/dcim/forms/bulk_import.py:1491 netbox/dcim/forms/bulk_import.py:1716 +#: netbox/dcim/forms/bulk_import.py:1779 netbox/ipam/forms/bulk_import.py:49 #: netbox/ipam/forms/bulk_import.py:78 netbox/ipam/forms/bulk_import.py:106 #: netbox/ipam/forms/bulk_import.py:126 netbox/ipam/forms/bulk_import.py:146 #: netbox/ipam/forms/bulk_import.py:174 netbox/ipam/forms/bulk_import.py:259 @@ -1020,8 +1020,8 @@ msgstr "Interface" #: netbox/dcim/forms/bulk_edit.py:445 netbox/dcim/forms/bulk_edit.py:684 #: netbox/dcim/forms/bulk_edit.py:733 netbox/dcim/forms/bulk_edit.py:875 #: netbox/dcim/forms/bulk_import.py:252 netbox/dcim/forms/bulk_import.py:355 -#: netbox/dcim/forms/bulk_import.py:646 netbox/dcim/forms/bulk_import.py:1618 -#: netbox/dcim/forms/bulk_import.py:1652 netbox/dcim/forms/filtersets.py:114 +#: netbox/dcim/forms/bulk_import.py:646 netbox/dcim/forms/bulk_import.py:1665 +#: netbox/dcim/forms/bulk_import.py:1699 netbox/dcim/forms/filtersets.py:114 #: netbox/dcim/forms/filtersets.py:358 netbox/dcim/forms/filtersets.py:393 #: netbox/dcim/forms/filtersets.py:438 netbox/dcim/forms/filtersets.py:491 #: netbox/dcim/forms/filtersets.py:820 netbox/dcim/forms/filtersets.py:864 @@ -1449,7 +1449,7 @@ msgstr "" #: netbox/extras/models/models.py:417 netbox/extras/models/models.py:482 #: netbox/extras/models/models.py:567 netbox/extras/models/models.py:692 #: netbox/extras/models/notifications.py:126 -#: netbox/extras/models/scripts.py:31 netbox/ipam/models/asns.py:18 +#: netbox/extras/models/scripts.py:29 netbox/ipam/models/asns.py:18 #: netbox/ipam/models/fhrp.py:24 netbox/ipam/models/services.py:51 #: netbox/ipam/models/services.py:80 netbox/ipam/models/vlans.py:38 #: netbox/ipam/models/vlans.py:217 netbox/ipam/models/vlans.py:363 @@ -1694,7 +1694,7 @@ msgstr "Terminações" #: netbox/dcim/forms/bulk_import.py:1096 netbox/dcim/forms/bulk_import.py:1115 #: netbox/dcim/forms/bulk_import.py:1134 netbox/dcim/forms/bulk_import.py:1146 #: netbox/dcim/forms/bulk_import.py:1194 netbox/dcim/forms/bulk_import.py:1316 -#: netbox/dcim/forms/bulk_import.py:1722 netbox/dcim/forms/connections.py:34 +#: netbox/dcim/forms/bulk_import.py:1769 netbox/dcim/forms/connections.py:34 #: netbox/dcim/forms/filtersets.py:156 netbox/dcim/forms/filtersets.py:1021 #: netbox/dcim/forms/filtersets.py:1054 netbox/dcim/forms/filtersets.py:1202 #: netbox/dcim/forms/filtersets.py:1418 netbox/dcim/forms/filtersets.py:1441 @@ -4312,8 +4312,8 @@ msgstr "Fluxo de Ar" #: netbox/dcim/forms/bulk_edit.py:444 netbox/dcim/forms/bulk_edit.py:897 #: netbox/dcim/forms/bulk_import.py:362 netbox/dcim/forms/bulk_import.py:365 -#: netbox/dcim/forms/bulk_import.py:653 netbox/dcim/forms/bulk_import.py:1659 -#: netbox/dcim/forms/bulk_import.py:1663 netbox/dcim/forms/filtersets.py:123 +#: netbox/dcim/forms/bulk_import.py:653 netbox/dcim/forms/bulk_import.py:1706 +#: netbox/dcim/forms/bulk_import.py:1710 netbox/dcim/forms/filtersets.py:123 #: netbox/dcim/forms/filtersets.py:359 netbox/dcim/forms/filtersets.py:448 #: netbox/dcim/forms/filtersets.py:462 netbox/dcim/forms/filtersets.py:501 #: netbox/dcim/forms/filtersets.py:874 netbox/dcim/forms/filtersets.py:1086 @@ -4374,7 +4374,7 @@ msgstr "Esquema" #: netbox/dcim/forms/bulk_edit.py:555 netbox/dcim/forms/bulk_edit.py:562 #: netbox/dcim/forms/bulk_edit.py:793 netbox/dcim/forms/bulk_import.py:460 -#: netbox/dcim/forms/bulk_import.py:1459 netbox/dcim/forms/filtersets.py:690 +#: netbox/dcim/forms/bulk_import.py:1475 netbox/dcim/forms/filtersets.py:690 #: netbox/dcim/forms/filtersets.py:1215 netbox/dcim/forms/model_forms.py:444 #: netbox/dcim/forms/model_forms.py:457 netbox/dcim/tables/modules.py:43 #: netbox/extras/forms/filtersets.py:413 @@ -4499,8 +4499,8 @@ msgstr "Rótulo" msgid "Length" msgstr "Comprimento" -#: netbox/dcim/forms/bulk_edit.py:818 netbox/dcim/forms/bulk_import.py:1478 -#: netbox/dcim/forms/bulk_import.py:1481 netbox/dcim/forms/filtersets.py:1228 +#: netbox/dcim/forms/bulk_edit.py:818 netbox/dcim/forms/bulk_import.py:1494 +#: netbox/dcim/forms/bulk_import.py:1497 netbox/dcim/forms/filtersets.py:1228 msgid "Length unit" msgstr "Unidade de comprimento" @@ -4508,17 +4508,17 @@ msgstr "Unidade de comprimento" msgid "Domain" msgstr "Domínio" -#: netbox/dcim/forms/bulk_edit.py:892 netbox/dcim/forms/bulk_import.py:1646 +#: netbox/dcim/forms/bulk_edit.py:892 netbox/dcim/forms/bulk_import.py:1693 #: netbox/dcim/forms/filtersets.py:1316 netbox/dcim/forms/model_forms.py:891 msgid "Power panel" msgstr "Quadro de alimentação" -#: netbox/dcim/forms/bulk_edit.py:914 netbox/dcim/forms/bulk_import.py:1682 +#: netbox/dcim/forms/bulk_edit.py:914 netbox/dcim/forms/bulk_import.py:1729 #: netbox/dcim/forms/filtersets.py:1338 msgid "Supply" msgstr "Tipo de Alimentação" -#: netbox/dcim/forms/bulk_edit.py:920 netbox/dcim/forms/bulk_import.py:1687 +#: netbox/dcim/forms/bulk_edit.py:920 netbox/dcim/forms/bulk_import.py:1734 #: netbox/dcim/forms/filtersets.py:1343 msgid "Phase" msgstr "Fase" @@ -4749,7 +4749,7 @@ msgid "available options" msgstr "opções disponíveis" #: netbox/dcim/forms/bulk_import.py:149 netbox/dcim/forms/bulk_import.py:643 -#: netbox/dcim/forms/bulk_import.py:1643 netbox/ipam/forms/bulk_import.py:512 +#: netbox/dcim/forms/bulk_import.py:1690 netbox/ipam/forms/bulk_import.py:512 #: netbox/virtualization/forms/bulk_import.py:64 #: netbox/virtualization/forms/bulk_import.py:102 msgid "Assigned site" @@ -4813,7 +4813,7 @@ msgstr "" msgid "Parent site" msgstr "Site principal" -#: netbox/dcim/forms/bulk_import.py:359 netbox/dcim/forms/bulk_import.py:1656 +#: netbox/dcim/forms/bulk_import.py:359 netbox/dcim/forms/bulk_import.py:1703 msgid "Rack's location (if any)" msgstr "Localização do rack (se houver)" @@ -4881,7 +4881,7 @@ msgstr "Plataforma não encontrada." msgid "Limit platform assignments to this manufacturer" msgstr "Limitar as atribuições de plataforma a este fabricante" -#: netbox/dcim/forms/bulk_import.py:576 netbox/dcim/forms/bulk_import.py:1725 +#: netbox/dcim/forms/bulk_import.py:576 netbox/dcim/forms/bulk_import.py:1772 #: netbox/tenancy/forms/bulk_import.py:116 msgid "Assigned role" msgstr "Função designada" @@ -5094,7 +5094,7 @@ msgstr "" "{device}" #: netbox/dcim/forms/bulk_import.py:1103 netbox/dcim/forms/bulk_import.py:1121 -#: netbox/dcim/forms/bulk_import.py:1468 +#: netbox/dcim/forms/bulk_import.py:1484 msgid "Physical medium classification" msgstr "Tipo de conexão do meio físico" @@ -5193,70 +5193,93 @@ msgstr "Site do dispositivo pai A (se houver)" msgid "Side A device" msgstr "Dispositivo no lado A" -#: netbox/dcim/forms/bulk_import.py:1413 netbox/dcim/forms/bulk_import.py:1438 -msgid "Device name" -msgstr "Nome do dispositivo" +#: netbox/dcim/forms/bulk_import.py:1414 netbox/dcim/forms/bulk_import.py:1447 +msgid "Device name (for device component terminations)" +msgstr "" -#: netbox/dcim/forms/bulk_import.py:1416 +#: netbox/dcim/forms/bulk_import.py:1417 +msgid "Side A power panel" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1421 netbox/dcim/forms/bulk_import.py:1454 +msgid "Power panel name (for power feed terminations)" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1424 msgid "Side A type" msgstr "Tipo de terminação no lado A" -#: netbox/dcim/forms/bulk_import.py:1422 +#: netbox/dcim/forms/bulk_import.py:1430 msgid "Side A name" msgstr "Nome da terminação no lado A" -#: netbox/dcim/forms/bulk_import.py:1423 netbox/dcim/forms/bulk_import.py:1448 +#: netbox/dcim/forms/bulk_import.py:1431 netbox/dcim/forms/bulk_import.py:1464 msgid "Termination name" msgstr "Nome da terminação" -#: netbox/dcim/forms/bulk_import.py:1428 +#: netbox/dcim/forms/bulk_import.py:1436 msgid "Side B site" msgstr "Site do lado B" -#: netbox/dcim/forms/bulk_import.py:1432 +#: netbox/dcim/forms/bulk_import.py:1440 #: netbox/wireless/forms/bulk_import.py:114 msgid "Site of parent device B (if any)" msgstr "Site do dispositivo pai B (se houver)" -#: netbox/dcim/forms/bulk_import.py:1435 +#: netbox/dcim/forms/bulk_import.py:1443 msgid "Side B device" msgstr "Dispositivo no lado B" -#: netbox/dcim/forms/bulk_import.py:1441 +#: netbox/dcim/forms/bulk_import.py:1450 +msgid "Side B power panel" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1457 msgid "Side B type" msgstr "Tipo de terminação no lado B" -#: netbox/dcim/forms/bulk_import.py:1447 +#: netbox/dcim/forms/bulk_import.py:1463 msgid "Side B name" msgstr "Nome da terminação no lado B" -#: netbox/dcim/forms/bulk_import.py:1456 +#: netbox/dcim/forms/bulk_import.py:1472 #: netbox/templates/dcim/panels/connection.html:60 #: netbox/wireless/forms/bulk_import.py:133 msgid "Connection status" msgstr "Status da conexão" -#: netbox/dcim/forms/bulk_import.py:1462 +#: netbox/dcim/forms/bulk_import.py:1478 msgid "Cable connection profile" msgstr "Perfil de conexão do cabo" -#: netbox/dcim/forms/bulk_import.py:1487 +#: netbox/dcim/forms/bulk_import.py:1503 msgid "Color name (e.g. \"Red\") or hex code (e.g. \"f44336\")" msgstr "" "Nome da cor (por exemplo, “Vermelho”) ou código hexadecimal (por exemplo, " "“f44336\")" -#: netbox/dcim/forms/bulk_import.py:1542 +#: netbox/dcim/forms/bulk_import.py:1564 +#, python-brace-format +msgid "" +"Side {side_upper}: {power_panel} {termination_object} is already connected" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1570 +#, python-brace-format +msgid "{side_upper} side termination not found: {power_panel} {name}" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1588 #, python-brace-format msgid "Side {side_upper}: {device} {termination_object} is already connected" msgstr "Lado {side_upper}: {device} {termination_object} já está conectado" -#: netbox/dcim/forms/bulk_import.py:1548 +#: netbox/dcim/forms/bulk_import.py:1594 #, python-brace-format msgid "{side_upper} side termination not found: {device} {name}" msgstr " Terminação {side_upper} não encontrada: {device} {name}" -#: netbox/dcim/forms/bulk_import.py:1569 +#: netbox/dcim/forms/bulk_import.py:1616 #, python-brace-format msgid "" "{color} did not match any used color name and was longer than six " @@ -5265,53 +5288,53 @@ msgstr "" "{color} não corresponde a nenhum nome de cor usado e tem mais de seis " "caracteres: hexadecimal inválido." -#: netbox/dcim/forms/bulk_import.py:1594 netbox/dcim/forms/model_forms.py:926 +#: netbox/dcim/forms/bulk_import.py:1641 netbox/dcim/forms/model_forms.py:926 #: netbox/dcim/tables/devices.py:1144 #: netbox/templates/dcim/panels/virtual_chassis_members.html:10 msgid "Master" msgstr "Mestre" -#: netbox/dcim/forms/bulk_import.py:1598 +#: netbox/dcim/forms/bulk_import.py:1645 msgid "Master device" msgstr "Dispositivo mestre" -#: netbox/dcim/forms/bulk_import.py:1615 +#: netbox/dcim/forms/bulk_import.py:1662 msgid "Name of parent site" msgstr "Nome do site principal" -#: netbox/dcim/forms/bulk_import.py:1649 +#: netbox/dcim/forms/bulk_import.py:1696 msgid "Upstream power panel" msgstr "Quadro de alimentação" -#: netbox/dcim/forms/bulk_import.py:1679 +#: netbox/dcim/forms/bulk_import.py:1726 msgid "Primary or redundant" msgstr "Primário ou redundante" -#: netbox/dcim/forms/bulk_import.py:1684 +#: netbox/dcim/forms/bulk_import.py:1731 msgid "Supply type (AC/DC)" msgstr "Tipo de alimentação (AC/DC)" -#: netbox/dcim/forms/bulk_import.py:1689 +#: netbox/dcim/forms/bulk_import.py:1736 msgid "Single or three-phase" msgstr "Monofásico ou trifásico" -#: netbox/dcim/forms/bulk_import.py:1739 netbox/dcim/forms/model_forms.py:1901 +#: netbox/dcim/forms/bulk_import.py:1786 netbox/dcim/forms/model_forms.py:1901 #: netbox/dcim/ui/panels.py:110 netbox/dcim/ui/panels.py:354 #: netbox/virtualization/ui/panels.py:28 msgid "Primary IPv4" msgstr "IPv4 Primário" -#: netbox/dcim/forms/bulk_import.py:1743 +#: netbox/dcim/forms/bulk_import.py:1790 msgid "IPv4 address with mask, e.g. 1.2.3.4/24" msgstr "Endereço IPv4 com máscara, por exemplo, 1.2.3.4/24" -#: netbox/dcim/forms/bulk_import.py:1746 netbox/dcim/forms/model_forms.py:1910 +#: netbox/dcim/forms/bulk_import.py:1793 netbox/dcim/forms/model_forms.py:1910 #: netbox/dcim/ui/panels.py:115 netbox/dcim/ui/panels.py:359 #: netbox/virtualization/ui/panels.py:33 msgid "Primary IPv6" msgstr "IPv6 Primário" -#: netbox/dcim/forms/bulk_import.py:1750 +#: netbox/dcim/forms/bulk_import.py:1797 msgid "IPv6 address with prefix length, e.g. 2001:db8::1/64" msgstr "Endereço IPv6 com tamanho de prefixo, por exemplo, 2001:db8: :1/64" @@ -10095,23 +10118,23 @@ msgstr "subscrição" msgid "subscriptions" msgstr "subscrições" -#: netbox/extras/models/scripts.py:43 +#: netbox/extras/models/scripts.py:41 msgid "is executable" msgstr "é executável" -#: netbox/extras/models/scripts.py:65 +#: netbox/extras/models/scripts.py:63 msgid "script" msgstr "script" -#: netbox/extras/models/scripts.py:66 +#: netbox/extras/models/scripts.py:64 msgid "scripts" msgstr "scripts" -#: netbox/extras/models/scripts.py:112 +#: netbox/extras/models/scripts.py:110 msgid "script module" msgstr "módulo de script" -#: netbox/extras/models/scripts.py:113 +#: netbox/extras/models/scripts.py:111 msgid "script modules" msgstr "módulos de scripts" diff --git a/netbox/translations/ru/LC_MESSAGES/django.mo b/netbox/translations/ru/LC_MESSAGES/django.mo index b1291be369c710f96ec02620cd82d277b6ac199a..ceac9e149194fb4d652703e08fc954883c3e9fa2 100644 GIT binary patch delta 73466 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 N4)4x@^nvTb{}0mjk-`7~ delta 73527 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 diff --git a/netbox/translations/ru/LC_MESSAGES/django.po b/netbox/translations/ru/LC_MESSAGES/django.po index 158314616..47f34d59f 100644 --- a/netbox/translations/ru/LC_MESSAGES/django.po +++ b/netbox/translations/ru/LC_MESSAGES/django.po @@ -24,7 +24,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-04-10 05:39+0000\n" +"POT-Creation-Date: 2026-04-14 05:39+0000\n" "PO-Revision-Date: 2023-10-30 17:48+0000\n" "Last-Translator: Jeremy Stretch, 2026\n" "Language-Team: Russian (https://app.transifex.com/netbox-community/teams/178115/ru/)\n" @@ -191,8 +191,8 @@ msgstr "Группа площадок (подстрока)" #: netbox/dcim/forms/bulk_edit.py:329 netbox/dcim/forms/bulk_edit.py:679 #: netbox/dcim/forms/bulk_edit.py:866 netbox/dcim/forms/bulk_import.py:146 #: netbox/dcim/forms/bulk_import.py:247 netbox/dcim/forms/bulk_import.py:349 -#: netbox/dcim/forms/bulk_import.py:640 netbox/dcim/forms/bulk_import.py:1612 -#: netbox/dcim/forms/bulk_import.py:1640 netbox/dcim/forms/filtersets.py:106 +#: netbox/dcim/forms/bulk_import.py:640 netbox/dcim/forms/bulk_import.py:1659 +#: netbox/dcim/forms/bulk_import.py:1687 netbox/dcim/forms/filtersets.py:106 #: netbox/dcim/forms/filtersets.py:256 netbox/dcim/forms/filtersets.py:379 #: netbox/dcim/forms/filtersets.py:483 netbox/dcim/forms/filtersets.py:855 #: netbox/dcim/forms/filtersets.py:1073 netbox/dcim/forms/filtersets.py:1147 @@ -470,7 +470,7 @@ msgstr "Идентификатор Службы" #: netbox/dcim/forms/bulk_edit.py:611 netbox/dcim/forms/bulk_edit.py:809 #: netbox/dcim/forms/bulk_edit.py:1063 netbox/dcim/forms/bulk_edit.py:1162 #: netbox/dcim/forms/bulk_edit.py:1189 netbox/dcim/forms/bulk_edit.py:1723 -#: netbox/dcim/forms/bulk_import.py:1484 netbox/dcim/forms/filtersets.py:1220 +#: netbox/dcim/forms/bulk_import.py:1500 netbox/dcim/forms/filtersets.py:1220 #: netbox/dcim/forms/filtersets.py:1545 netbox/dcim/forms/filtersets.py:1761 #: netbox/dcim/forms/filtersets.py:1780 netbox/dcim/forms/filtersets.py:1804 #: netbox/dcim/forms/filtersets.py:1823 netbox/dcim/tables/devices.py:806 @@ -502,8 +502,8 @@ msgstr "Цвет" #: netbox/dcim/forms/bulk_import.py:813 netbox/dcim/forms/bulk_import.py:839 #: netbox/dcim/forms/bulk_import.py:865 netbox/dcim/forms/bulk_import.py:886 #: netbox/dcim/forms/bulk_import.py:972 netbox/dcim/forms/bulk_import.py:1101 -#: netbox/dcim/forms/bulk_import.py:1120 netbox/dcim/forms/bulk_import.py:1465 -#: netbox/dcim/forms/bulk_import.py:1677 netbox/dcim/forms/filtersets.py:1104 +#: netbox/dcim/forms/bulk_import.py:1120 netbox/dcim/forms/bulk_import.py:1481 +#: netbox/dcim/forms/bulk_import.py:1724 netbox/dcim/forms/filtersets.py:1104 #: netbox/dcim/forms/filtersets.py:1205 netbox/dcim/forms/filtersets.py:1333 #: netbox/dcim/forms/filtersets.py:1424 netbox/dcim/forms/filtersets.py:1444 #: netbox/dcim/forms/filtersets.py:1464 netbox/dcim/forms/filtersets.py:1484 @@ -561,8 +561,8 @@ msgstr "Аккаунт провайдера" #: netbox/dcim/forms/bulk_import.py:103 netbox/dcim/forms/bulk_import.py:162 #: netbox/dcim/forms/bulk_import.py:265 netbox/dcim/forms/bulk_import.py:374 #: netbox/dcim/forms/bulk_import.py:605 netbox/dcim/forms/bulk_import.py:765 -#: netbox/dcim/forms/bulk_import.py:1230 netbox/dcim/forms/bulk_import.py:1453 -#: netbox/dcim/forms/bulk_import.py:1672 netbox/dcim/forms/bulk_import.py:1735 +#: netbox/dcim/forms/bulk_import.py:1230 netbox/dcim/forms/bulk_import.py:1469 +#: netbox/dcim/forms/bulk_import.py:1719 netbox/dcim/forms/bulk_import.py:1782 #: netbox/dcim/forms/filtersets.py:208 netbox/dcim/forms/filtersets.py:268 #: netbox/dcim/forms/filtersets.py:396 netbox/dcim/forms/filtersets.py:504 #: netbox/dcim/forms/filtersets.py:901 netbox/dcim/forms/filtersets.py:1024 @@ -623,8 +623,8 @@ msgstr "Статус" #: netbox/dcim/forms/bulk_edit.py:799 netbox/dcim/forms/bulk_edit.py:1746 #: netbox/dcim/forms/bulk_import.py:122 netbox/dcim/forms/bulk_import.py:167 #: netbox/dcim/forms/bulk_import.py:258 netbox/dcim/forms/bulk_import.py:379 -#: netbox/dcim/forms/bulk_import.py:579 netbox/dcim/forms/bulk_import.py:1471 -#: netbox/dcim/forms/bulk_import.py:1728 netbox/dcim/forms/filtersets.py:143 +#: netbox/dcim/forms/bulk_import.py:579 netbox/dcim/forms/bulk_import.py:1487 +#: netbox/dcim/forms/bulk_import.py:1775 netbox/dcim/forms/filtersets.py:143 #: netbox/dcim/forms/filtersets.py:202 netbox/dcim/forms/filtersets.py:235 #: netbox/dcim/forms/filtersets.py:363 netbox/dcim/forms/filtersets.py:442 #: netbox/dcim/forms/filtersets.py:463 netbox/dcim/forms/filtersets.py:823 @@ -810,7 +810,7 @@ msgstr "Описание" #: netbox/circuits/forms/bulk_edit.py:192 #: netbox/circuits/forms/model_forms.py:199 -#: netbox/dcim/forms/bulk_import.py:1419 netbox/dcim/forms/bulk_import.py:1444 +#: netbox/dcim/forms/bulk_import.py:1427 netbox/dcim/forms/bulk_import.py:1460 msgid "Termination type" msgstr "Тип точки подключения" @@ -940,7 +940,7 @@ msgstr "Тип канала связи" #: netbox/dcim/forms/bulk_import.py:105 netbox/dcim/forms/bulk_import.py:164 #: netbox/dcim/forms/bulk_import.py:267 netbox/dcim/forms/bulk_import.py:376 #: netbox/dcim/forms/bulk_import.py:607 netbox/dcim/forms/bulk_import.py:767 -#: netbox/dcim/forms/bulk_import.py:1232 netbox/dcim/forms/bulk_import.py:1674 +#: netbox/dcim/forms/bulk_import.py:1232 netbox/dcim/forms/bulk_import.py:1721 #: netbox/ipam/forms/bulk_import.py:200 netbox/ipam/forms/bulk_import.py:264 #: netbox/ipam/forms/bulk_import.py:300 netbox/ipam/forms/bulk_import.py:531 #: netbox/ipam/forms/bulk_import.py:544 @@ -956,8 +956,8 @@ msgstr "Операционный статус" #: netbox/circuits/forms/bulk_import.py:235 #: netbox/dcim/forms/bulk_import.py:126 netbox/dcim/forms/bulk_import.py:171 #: netbox/dcim/forms/bulk_import.py:383 netbox/dcim/forms/bulk_import.py:583 -#: netbox/dcim/forms/bulk_import.py:1475 netbox/dcim/forms/bulk_import.py:1669 -#: netbox/dcim/forms/bulk_import.py:1732 netbox/ipam/forms/bulk_import.py:49 +#: netbox/dcim/forms/bulk_import.py:1491 netbox/dcim/forms/bulk_import.py:1716 +#: netbox/dcim/forms/bulk_import.py:1779 netbox/ipam/forms/bulk_import.py:49 #: netbox/ipam/forms/bulk_import.py:78 netbox/ipam/forms/bulk_import.py:106 #: netbox/ipam/forms/bulk_import.py:126 netbox/ipam/forms/bulk_import.py:146 #: netbox/ipam/forms/bulk_import.py:174 netbox/ipam/forms/bulk_import.py:259 @@ -1030,8 +1030,8 @@ msgstr "Интерфейс" #: netbox/dcim/forms/bulk_edit.py:445 netbox/dcim/forms/bulk_edit.py:684 #: netbox/dcim/forms/bulk_edit.py:733 netbox/dcim/forms/bulk_edit.py:875 #: netbox/dcim/forms/bulk_import.py:252 netbox/dcim/forms/bulk_import.py:355 -#: netbox/dcim/forms/bulk_import.py:646 netbox/dcim/forms/bulk_import.py:1618 -#: netbox/dcim/forms/bulk_import.py:1652 netbox/dcim/forms/filtersets.py:114 +#: netbox/dcim/forms/bulk_import.py:646 netbox/dcim/forms/bulk_import.py:1665 +#: netbox/dcim/forms/bulk_import.py:1699 netbox/dcim/forms/filtersets.py:114 #: netbox/dcim/forms/filtersets.py:358 netbox/dcim/forms/filtersets.py:393 #: netbox/dcim/forms/filtersets.py:438 netbox/dcim/forms/filtersets.py:491 #: netbox/dcim/forms/filtersets.py:820 netbox/dcim/forms/filtersets.py:864 @@ -1458,7 +1458,7 @@ msgstr "Конец цепи должен быть прикреплен к кон #: netbox/extras/models/models.py:417 netbox/extras/models/models.py:482 #: netbox/extras/models/models.py:567 netbox/extras/models/models.py:692 #: netbox/extras/models/notifications.py:126 -#: netbox/extras/models/scripts.py:31 netbox/ipam/models/asns.py:18 +#: netbox/extras/models/scripts.py:29 netbox/ipam/models/asns.py:18 #: netbox/ipam/models/fhrp.py:24 netbox/ipam/models/services.py:51 #: netbox/ipam/models/services.py:80 netbox/ipam/models/vlans.py:38 #: netbox/ipam/models/vlans.py:217 netbox/ipam/models/vlans.py:363 @@ -1703,7 +1703,7 @@ msgstr "Соединения" #: netbox/dcim/forms/bulk_import.py:1096 netbox/dcim/forms/bulk_import.py:1115 #: netbox/dcim/forms/bulk_import.py:1134 netbox/dcim/forms/bulk_import.py:1146 #: netbox/dcim/forms/bulk_import.py:1194 netbox/dcim/forms/bulk_import.py:1316 -#: netbox/dcim/forms/bulk_import.py:1722 netbox/dcim/forms/connections.py:34 +#: netbox/dcim/forms/bulk_import.py:1769 netbox/dcim/forms/connections.py:34 #: netbox/dcim/forms/filtersets.py:156 netbox/dcim/forms/filtersets.py:1021 #: netbox/dcim/forms/filtersets.py:1054 netbox/dcim/forms/filtersets.py:1202 #: netbox/dcim/forms/filtersets.py:1418 netbox/dcim/forms/filtersets.py:1441 @@ -4319,8 +4319,8 @@ msgstr "Воздушный поток" #: netbox/dcim/forms/bulk_edit.py:444 netbox/dcim/forms/bulk_edit.py:897 #: netbox/dcim/forms/bulk_import.py:362 netbox/dcim/forms/bulk_import.py:365 -#: netbox/dcim/forms/bulk_import.py:653 netbox/dcim/forms/bulk_import.py:1659 -#: netbox/dcim/forms/bulk_import.py:1663 netbox/dcim/forms/filtersets.py:123 +#: netbox/dcim/forms/bulk_import.py:653 netbox/dcim/forms/bulk_import.py:1706 +#: netbox/dcim/forms/bulk_import.py:1710 netbox/dcim/forms/filtersets.py:123 #: netbox/dcim/forms/filtersets.py:359 netbox/dcim/forms/filtersets.py:448 #: netbox/dcim/forms/filtersets.py:462 netbox/dcim/forms/filtersets.py:501 #: netbox/dcim/forms/filtersets.py:874 netbox/dcim/forms/filtersets.py:1086 @@ -4381,7 +4381,7 @@ msgstr "Схема" #: netbox/dcim/forms/bulk_edit.py:555 netbox/dcim/forms/bulk_edit.py:562 #: netbox/dcim/forms/bulk_edit.py:793 netbox/dcim/forms/bulk_import.py:460 -#: netbox/dcim/forms/bulk_import.py:1459 netbox/dcim/forms/filtersets.py:690 +#: netbox/dcim/forms/bulk_import.py:1475 netbox/dcim/forms/filtersets.py:690 #: netbox/dcim/forms/filtersets.py:1215 netbox/dcim/forms/model_forms.py:444 #: netbox/dcim/forms/model_forms.py:457 netbox/dcim/tables/modules.py:43 #: netbox/extras/forms/filtersets.py:413 @@ -4506,8 +4506,8 @@ msgstr "Лейбл" msgid "Length" msgstr "Длина" -#: netbox/dcim/forms/bulk_edit.py:818 netbox/dcim/forms/bulk_import.py:1478 -#: netbox/dcim/forms/bulk_import.py:1481 netbox/dcim/forms/filtersets.py:1228 +#: netbox/dcim/forms/bulk_edit.py:818 netbox/dcim/forms/bulk_import.py:1494 +#: netbox/dcim/forms/bulk_import.py:1497 netbox/dcim/forms/filtersets.py:1228 msgid "Length unit" msgstr "Единица длины" @@ -4515,17 +4515,17 @@ msgstr "Единица длины" msgid "Domain" msgstr "Домен" -#: netbox/dcim/forms/bulk_edit.py:892 netbox/dcim/forms/bulk_import.py:1646 +#: netbox/dcim/forms/bulk_edit.py:892 netbox/dcim/forms/bulk_import.py:1693 #: netbox/dcim/forms/filtersets.py:1316 netbox/dcim/forms/model_forms.py:891 msgid "Power panel" msgstr "Распределительный щит" -#: netbox/dcim/forms/bulk_edit.py:914 netbox/dcim/forms/bulk_import.py:1682 +#: netbox/dcim/forms/bulk_edit.py:914 netbox/dcim/forms/bulk_import.py:1729 #: netbox/dcim/forms/filtersets.py:1338 msgid "Supply" msgstr "Снабжение" -#: netbox/dcim/forms/bulk_edit.py:920 netbox/dcim/forms/bulk_import.py:1687 +#: netbox/dcim/forms/bulk_edit.py:920 netbox/dcim/forms/bulk_import.py:1734 #: netbox/dcim/forms/filtersets.py:1343 msgid "Phase" msgstr "Фаза" @@ -4756,7 +4756,7 @@ msgid "available options" msgstr "доступные опции" #: netbox/dcim/forms/bulk_import.py:149 netbox/dcim/forms/bulk_import.py:643 -#: netbox/dcim/forms/bulk_import.py:1643 netbox/ipam/forms/bulk_import.py:512 +#: netbox/dcim/forms/bulk_import.py:1690 netbox/ipam/forms/bulk_import.py:512 #: netbox/virtualization/forms/bulk_import.py:64 #: netbox/virtualization/forms/bulk_import.py:102 msgid "Assigned site" @@ -4819,7 +4819,7 @@ msgstr "Если не указан тип стойки, необходимо з msgid "Parent site" msgstr "Родительская площадка" -#: netbox/dcim/forms/bulk_import.py:359 netbox/dcim/forms/bulk_import.py:1656 +#: netbox/dcim/forms/bulk_import.py:359 netbox/dcim/forms/bulk_import.py:1703 msgid "Rack's location (if any)" msgstr "Локация стойки (если есть)" @@ -4886,7 +4886,7 @@ msgstr "Платформа не найдена." msgid "Limit platform assignments to this manufacturer" msgstr "Ограничьте назначение платформ этим производителем" -#: netbox/dcim/forms/bulk_import.py:576 netbox/dcim/forms/bulk_import.py:1725 +#: netbox/dcim/forms/bulk_import.py:576 netbox/dcim/forms/bulk_import.py:1772 #: netbox/tenancy/forms/bulk_import.py:116 msgid "Assigned role" msgstr "Назначенная роль" @@ -5098,7 +5098,7 @@ msgid "VDC {vdc} is not assigned to device {device}" msgstr "В ПОСТОЯННОГО ТОКА {vdc} не присвоено устройству {device}" #: netbox/dcim/forms/bulk_import.py:1103 netbox/dcim/forms/bulk_import.py:1121 -#: netbox/dcim/forms/bulk_import.py:1468 +#: netbox/dcim/forms/bulk_import.py:1484 msgid "Physical medium classification" msgstr "Классификация физических сред" @@ -5197,70 +5197,93 @@ msgstr "Сайт родительского устройства A (если е msgid "Side A device" msgstr "Устройство на стороне А" -#: netbox/dcim/forms/bulk_import.py:1413 netbox/dcim/forms/bulk_import.py:1438 -msgid "Device name" -msgstr "Имя устройства" +#: netbox/dcim/forms/bulk_import.py:1414 netbox/dcim/forms/bulk_import.py:1447 +msgid "Device name (for device component terminations)" +msgstr "" -#: netbox/dcim/forms/bulk_import.py:1416 +#: netbox/dcim/forms/bulk_import.py:1417 +msgid "Side A power panel" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1421 netbox/dcim/forms/bulk_import.py:1454 +msgid "Power panel name (for power feed terminations)" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1424 msgid "Side A type" msgstr "Сторона типа А" -#: netbox/dcim/forms/bulk_import.py:1422 +#: netbox/dcim/forms/bulk_import.py:1430 msgid "Side A name" msgstr "Название стороны А" -#: netbox/dcim/forms/bulk_import.py:1423 netbox/dcim/forms/bulk_import.py:1448 +#: netbox/dcim/forms/bulk_import.py:1431 netbox/dcim/forms/bulk_import.py:1464 msgid "Termination name" msgstr "Название точки подключения" -#: netbox/dcim/forms/bulk_import.py:1428 +#: netbox/dcim/forms/bulk_import.py:1436 msgid "Side B site" msgstr "Сайт на стороне B" -#: netbox/dcim/forms/bulk_import.py:1432 +#: netbox/dcim/forms/bulk_import.py:1440 #: netbox/wireless/forms/bulk_import.py:114 msgid "Site of parent device B (if any)" msgstr "Сайт родительского устройства B (если есть)" -#: netbox/dcim/forms/bulk_import.py:1435 +#: netbox/dcim/forms/bulk_import.py:1443 msgid "Side B device" msgstr "Устройство на стороне B" -#: netbox/dcim/forms/bulk_import.py:1441 +#: netbox/dcim/forms/bulk_import.py:1450 +msgid "Side B power panel" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1457 msgid "Side B type" msgstr "Тип стороны B" -#: netbox/dcim/forms/bulk_import.py:1447 +#: netbox/dcim/forms/bulk_import.py:1463 msgid "Side B name" msgstr "Название стороны B" -#: netbox/dcim/forms/bulk_import.py:1456 +#: netbox/dcim/forms/bulk_import.py:1472 #: netbox/templates/dcim/panels/connection.html:60 #: netbox/wireless/forms/bulk_import.py:133 msgid "Connection status" msgstr "Состояние подключения" -#: netbox/dcim/forms/bulk_import.py:1462 +#: netbox/dcim/forms/bulk_import.py:1478 msgid "Cable connection profile" msgstr "Профиль кабельного соединения" -#: netbox/dcim/forms/bulk_import.py:1487 +#: netbox/dcim/forms/bulk_import.py:1503 msgid "Color name (e.g. \"Red\") or hex code (e.g. \"f44336\")" msgstr "" "Название цвета (например, «Красный») или шестнадцатеричный код (например, " "«f44336»)" -#: netbox/dcim/forms/bulk_import.py:1542 +#: netbox/dcim/forms/bulk_import.py:1564 +#, python-brace-format +msgid "" +"Side {side_upper}: {power_panel} {termination_object} is already connected" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1570 +#, python-brace-format +msgid "{side_upper} side termination not found: {power_panel} {name}" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1588 #, python-brace-format msgid "Side {side_upper}: {device} {termination_object} is already connected" msgstr "Сторона {side_upper}: {device} {termination_object} уже подключен" -#: netbox/dcim/forms/bulk_import.py:1548 +#: netbox/dcim/forms/bulk_import.py:1594 #, python-brace-format msgid "{side_upper} side termination not found: {device} {name}" msgstr "{side_upper} боковое завершение не найдено: {device} {name}" -#: netbox/dcim/forms/bulk_import.py:1569 +#: netbox/dcim/forms/bulk_import.py:1616 #, python-brace-format msgid "" "{color} did not match any used color name and was longer than six " @@ -5269,53 +5292,53 @@ msgstr "" "{color} не совпадало ни с одним из используемых названий цветов и содержало " "более шести символов: неправильный шестнадцатеричный код." -#: netbox/dcim/forms/bulk_import.py:1594 netbox/dcim/forms/model_forms.py:926 +#: netbox/dcim/forms/bulk_import.py:1641 netbox/dcim/forms/model_forms.py:926 #: netbox/dcim/tables/devices.py:1144 #: netbox/templates/dcim/panels/virtual_chassis_members.html:10 msgid "Master" msgstr "Мастер" -#: netbox/dcim/forms/bulk_import.py:1598 +#: netbox/dcim/forms/bulk_import.py:1645 msgid "Master device" msgstr "Мастер-устройство" -#: netbox/dcim/forms/bulk_import.py:1615 +#: netbox/dcim/forms/bulk_import.py:1662 msgid "Name of parent site" msgstr "Название родительской площадки" -#: netbox/dcim/forms/bulk_import.py:1649 +#: netbox/dcim/forms/bulk_import.py:1696 msgid "Upstream power panel" msgstr "Распределительный щит" -#: netbox/dcim/forms/bulk_import.py:1679 +#: netbox/dcim/forms/bulk_import.py:1726 msgid "Primary or redundant" msgstr "Основное или резервное" -#: netbox/dcim/forms/bulk_import.py:1684 +#: netbox/dcim/forms/bulk_import.py:1731 msgid "Supply type (AC/DC)" msgstr "Тип питания (AC/DC)" -#: netbox/dcim/forms/bulk_import.py:1689 +#: netbox/dcim/forms/bulk_import.py:1736 msgid "Single or three-phase" msgstr "Однофазный или трехфазный" -#: netbox/dcim/forms/bulk_import.py:1739 netbox/dcim/forms/model_forms.py:1901 +#: netbox/dcim/forms/bulk_import.py:1786 netbox/dcim/forms/model_forms.py:1901 #: netbox/dcim/ui/panels.py:110 netbox/dcim/ui/panels.py:354 #: netbox/virtualization/ui/panels.py:28 msgid "Primary IPv4" msgstr "Основной IPv4" -#: netbox/dcim/forms/bulk_import.py:1743 +#: netbox/dcim/forms/bulk_import.py:1790 msgid "IPv4 address with mask, e.g. 1.2.3.4/24" msgstr "Адрес IPv4 с маской, напр. 1.2.3.4/24" -#: netbox/dcim/forms/bulk_import.py:1746 netbox/dcim/forms/model_forms.py:1910 +#: netbox/dcim/forms/bulk_import.py:1793 netbox/dcim/forms/model_forms.py:1910 #: netbox/dcim/ui/panels.py:115 netbox/dcim/ui/panels.py:359 #: netbox/virtualization/ui/panels.py:33 msgid "Primary IPv6" msgstr "Основной IPv6" -#: netbox/dcim/forms/bulk_import.py:1750 +#: netbox/dcim/forms/bulk_import.py:1797 msgid "IPv6 address with prefix length, e.g. 2001:db8::1/64" msgstr "Адрес IPv6 с длиной префикса, напр. 2001:db8::1/64" @@ -10086,23 +10109,23 @@ msgstr "подписка" msgid "subscriptions" msgstr "подписки" -#: netbox/extras/models/scripts.py:43 +#: netbox/extras/models/scripts.py:41 msgid "is executable" msgstr "является исполняемым" -#: netbox/extras/models/scripts.py:65 +#: netbox/extras/models/scripts.py:63 msgid "script" msgstr "сценарий" -#: netbox/extras/models/scripts.py:66 +#: netbox/extras/models/scripts.py:64 msgid "scripts" msgstr "сценарии" -#: netbox/extras/models/scripts.py:112 +#: netbox/extras/models/scripts.py:110 msgid "script module" msgstr "скриптовый модуль" -#: netbox/extras/models/scripts.py:113 +#: netbox/extras/models/scripts.py:111 msgid "script modules" msgstr "скриптовые модули" diff --git a/netbox/translations/tr/LC_MESSAGES/django.mo b/netbox/translations/tr/LC_MESSAGES/django.mo index 130d3b4409d17a715c04a8ce9085bffa79f1e649..7afb895069d675196908a85e9586999584dca04e 100644 GIT binary patch delta 73491 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 GPy9bz4VNDP delta 73516 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 W{F}Box@pwK%VBn0yzJXE>Hh(wG>;|# diff --git a/netbox/translations/tr/LC_MESSAGES/django.po b/netbox/translations/tr/LC_MESSAGES/django.po index c578d0794..806cf2b71 100644 --- a/netbox/translations/tr/LC_MESSAGES/django.po +++ b/netbox/translations/tr/LC_MESSAGES/django.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-04-10 05:39+0000\n" +"POT-Creation-Date: 2026-04-14 05:39+0000\n" "PO-Revision-Date: 2023-10-30 17:48+0000\n" "Last-Translator: Jeremy Stretch, 2026\n" "Language-Team: Turkish (https://app.transifex.com/netbox-community/teams/178115/tr/)\n" @@ -180,8 +180,8 @@ msgstr "Site grubu (kısa ad)" #: netbox/dcim/forms/bulk_edit.py:329 netbox/dcim/forms/bulk_edit.py:679 #: netbox/dcim/forms/bulk_edit.py:866 netbox/dcim/forms/bulk_import.py:146 #: netbox/dcim/forms/bulk_import.py:247 netbox/dcim/forms/bulk_import.py:349 -#: netbox/dcim/forms/bulk_import.py:640 netbox/dcim/forms/bulk_import.py:1612 -#: netbox/dcim/forms/bulk_import.py:1640 netbox/dcim/forms/filtersets.py:106 +#: netbox/dcim/forms/bulk_import.py:640 netbox/dcim/forms/bulk_import.py:1659 +#: netbox/dcim/forms/bulk_import.py:1687 netbox/dcim/forms/filtersets.py:106 #: netbox/dcim/forms/filtersets.py:256 netbox/dcim/forms/filtersets.py:379 #: netbox/dcim/forms/filtersets.py:483 netbox/dcim/forms/filtersets.py:855 #: netbox/dcim/forms/filtersets.py:1073 netbox/dcim/forms/filtersets.py:1147 @@ -459,7 +459,7 @@ msgstr "Servis ID" #: netbox/dcim/forms/bulk_edit.py:611 netbox/dcim/forms/bulk_edit.py:809 #: netbox/dcim/forms/bulk_edit.py:1063 netbox/dcim/forms/bulk_edit.py:1162 #: netbox/dcim/forms/bulk_edit.py:1189 netbox/dcim/forms/bulk_edit.py:1723 -#: netbox/dcim/forms/bulk_import.py:1484 netbox/dcim/forms/filtersets.py:1220 +#: netbox/dcim/forms/bulk_import.py:1500 netbox/dcim/forms/filtersets.py:1220 #: netbox/dcim/forms/filtersets.py:1545 netbox/dcim/forms/filtersets.py:1761 #: netbox/dcim/forms/filtersets.py:1780 netbox/dcim/forms/filtersets.py:1804 #: netbox/dcim/forms/filtersets.py:1823 netbox/dcim/tables/devices.py:806 @@ -491,8 +491,8 @@ msgstr "Renk" #: netbox/dcim/forms/bulk_import.py:813 netbox/dcim/forms/bulk_import.py:839 #: netbox/dcim/forms/bulk_import.py:865 netbox/dcim/forms/bulk_import.py:886 #: netbox/dcim/forms/bulk_import.py:972 netbox/dcim/forms/bulk_import.py:1101 -#: netbox/dcim/forms/bulk_import.py:1120 netbox/dcim/forms/bulk_import.py:1465 -#: netbox/dcim/forms/bulk_import.py:1677 netbox/dcim/forms/filtersets.py:1104 +#: netbox/dcim/forms/bulk_import.py:1120 netbox/dcim/forms/bulk_import.py:1481 +#: netbox/dcim/forms/bulk_import.py:1724 netbox/dcim/forms/filtersets.py:1104 #: netbox/dcim/forms/filtersets.py:1205 netbox/dcim/forms/filtersets.py:1333 #: netbox/dcim/forms/filtersets.py:1424 netbox/dcim/forms/filtersets.py:1444 #: netbox/dcim/forms/filtersets.py:1464 netbox/dcim/forms/filtersets.py:1484 @@ -550,8 +550,8 @@ msgstr "Sağlayıcı hesabı" #: netbox/dcim/forms/bulk_import.py:103 netbox/dcim/forms/bulk_import.py:162 #: netbox/dcim/forms/bulk_import.py:265 netbox/dcim/forms/bulk_import.py:374 #: netbox/dcim/forms/bulk_import.py:605 netbox/dcim/forms/bulk_import.py:765 -#: netbox/dcim/forms/bulk_import.py:1230 netbox/dcim/forms/bulk_import.py:1453 -#: netbox/dcim/forms/bulk_import.py:1672 netbox/dcim/forms/bulk_import.py:1735 +#: netbox/dcim/forms/bulk_import.py:1230 netbox/dcim/forms/bulk_import.py:1469 +#: netbox/dcim/forms/bulk_import.py:1719 netbox/dcim/forms/bulk_import.py:1782 #: netbox/dcim/forms/filtersets.py:208 netbox/dcim/forms/filtersets.py:268 #: netbox/dcim/forms/filtersets.py:396 netbox/dcim/forms/filtersets.py:504 #: netbox/dcim/forms/filtersets.py:901 netbox/dcim/forms/filtersets.py:1024 @@ -612,8 +612,8 @@ msgstr "Durum" #: netbox/dcim/forms/bulk_edit.py:799 netbox/dcim/forms/bulk_edit.py:1746 #: netbox/dcim/forms/bulk_import.py:122 netbox/dcim/forms/bulk_import.py:167 #: netbox/dcim/forms/bulk_import.py:258 netbox/dcim/forms/bulk_import.py:379 -#: netbox/dcim/forms/bulk_import.py:579 netbox/dcim/forms/bulk_import.py:1471 -#: netbox/dcim/forms/bulk_import.py:1728 netbox/dcim/forms/filtersets.py:143 +#: netbox/dcim/forms/bulk_import.py:579 netbox/dcim/forms/bulk_import.py:1487 +#: netbox/dcim/forms/bulk_import.py:1775 netbox/dcim/forms/filtersets.py:143 #: netbox/dcim/forms/filtersets.py:202 netbox/dcim/forms/filtersets.py:235 #: netbox/dcim/forms/filtersets.py:363 netbox/dcim/forms/filtersets.py:442 #: netbox/dcim/forms/filtersets.py:463 netbox/dcim/forms/filtersets.py:823 @@ -799,7 +799,7 @@ msgstr "Açıklama" #: netbox/circuits/forms/bulk_edit.py:192 #: netbox/circuits/forms/model_forms.py:199 -#: netbox/dcim/forms/bulk_import.py:1419 netbox/dcim/forms/bulk_import.py:1444 +#: netbox/dcim/forms/bulk_import.py:1427 netbox/dcim/forms/bulk_import.py:1460 msgid "Termination type" msgstr "Sonlandırma türü" @@ -929,7 +929,7 @@ msgstr "Devre tipi" #: netbox/dcim/forms/bulk_import.py:105 netbox/dcim/forms/bulk_import.py:164 #: netbox/dcim/forms/bulk_import.py:267 netbox/dcim/forms/bulk_import.py:376 #: netbox/dcim/forms/bulk_import.py:607 netbox/dcim/forms/bulk_import.py:767 -#: netbox/dcim/forms/bulk_import.py:1232 netbox/dcim/forms/bulk_import.py:1674 +#: netbox/dcim/forms/bulk_import.py:1232 netbox/dcim/forms/bulk_import.py:1721 #: netbox/ipam/forms/bulk_import.py:200 netbox/ipam/forms/bulk_import.py:264 #: netbox/ipam/forms/bulk_import.py:300 netbox/ipam/forms/bulk_import.py:531 #: netbox/ipam/forms/bulk_import.py:544 @@ -945,8 +945,8 @@ msgstr "Operasyonel durum" #: netbox/circuits/forms/bulk_import.py:235 #: netbox/dcim/forms/bulk_import.py:126 netbox/dcim/forms/bulk_import.py:171 #: netbox/dcim/forms/bulk_import.py:383 netbox/dcim/forms/bulk_import.py:583 -#: netbox/dcim/forms/bulk_import.py:1475 netbox/dcim/forms/bulk_import.py:1669 -#: netbox/dcim/forms/bulk_import.py:1732 netbox/ipam/forms/bulk_import.py:49 +#: netbox/dcim/forms/bulk_import.py:1491 netbox/dcim/forms/bulk_import.py:1716 +#: netbox/dcim/forms/bulk_import.py:1779 netbox/ipam/forms/bulk_import.py:49 #: netbox/ipam/forms/bulk_import.py:78 netbox/ipam/forms/bulk_import.py:106 #: netbox/ipam/forms/bulk_import.py:126 netbox/ipam/forms/bulk_import.py:146 #: netbox/ipam/forms/bulk_import.py:174 netbox/ipam/forms/bulk_import.py:259 @@ -1019,8 +1019,8 @@ msgstr "Arayüz" #: netbox/dcim/forms/bulk_edit.py:445 netbox/dcim/forms/bulk_edit.py:684 #: netbox/dcim/forms/bulk_edit.py:733 netbox/dcim/forms/bulk_edit.py:875 #: netbox/dcim/forms/bulk_import.py:252 netbox/dcim/forms/bulk_import.py:355 -#: netbox/dcim/forms/bulk_import.py:646 netbox/dcim/forms/bulk_import.py:1618 -#: netbox/dcim/forms/bulk_import.py:1652 netbox/dcim/forms/filtersets.py:114 +#: netbox/dcim/forms/bulk_import.py:646 netbox/dcim/forms/bulk_import.py:1665 +#: netbox/dcim/forms/bulk_import.py:1699 netbox/dcim/forms/filtersets.py:114 #: netbox/dcim/forms/filtersets.py:358 netbox/dcim/forms/filtersets.py:393 #: netbox/dcim/forms/filtersets.py:438 netbox/dcim/forms/filtersets.py:491 #: netbox/dcim/forms/filtersets.py:820 netbox/dcim/forms/filtersets.py:864 @@ -1447,7 +1447,7 @@ msgstr "Bir devre sonlandırma, sonlandırma nesnesine bağlanmalıdır." #: netbox/extras/models/models.py:417 netbox/extras/models/models.py:482 #: netbox/extras/models/models.py:567 netbox/extras/models/models.py:692 #: netbox/extras/models/notifications.py:126 -#: netbox/extras/models/scripts.py:31 netbox/ipam/models/asns.py:18 +#: netbox/extras/models/scripts.py:29 netbox/ipam/models/asns.py:18 #: netbox/ipam/models/fhrp.py:24 netbox/ipam/models/services.py:51 #: netbox/ipam/models/services.py:80 netbox/ipam/models/vlans.py:38 #: netbox/ipam/models/vlans.py:217 netbox/ipam/models/vlans.py:363 @@ -1692,7 +1692,7 @@ msgstr "Fesih" #: netbox/dcim/forms/bulk_import.py:1096 netbox/dcim/forms/bulk_import.py:1115 #: netbox/dcim/forms/bulk_import.py:1134 netbox/dcim/forms/bulk_import.py:1146 #: netbox/dcim/forms/bulk_import.py:1194 netbox/dcim/forms/bulk_import.py:1316 -#: netbox/dcim/forms/bulk_import.py:1722 netbox/dcim/forms/connections.py:34 +#: netbox/dcim/forms/bulk_import.py:1769 netbox/dcim/forms/connections.py:34 #: netbox/dcim/forms/filtersets.py:156 netbox/dcim/forms/filtersets.py:1021 #: netbox/dcim/forms/filtersets.py:1054 netbox/dcim/forms/filtersets.py:1202 #: netbox/dcim/forms/filtersets.py:1418 netbox/dcim/forms/filtersets.py:1441 @@ -4301,8 +4301,8 @@ msgstr "Hava akışı" #: netbox/dcim/forms/bulk_edit.py:444 netbox/dcim/forms/bulk_edit.py:897 #: netbox/dcim/forms/bulk_import.py:362 netbox/dcim/forms/bulk_import.py:365 -#: netbox/dcim/forms/bulk_import.py:653 netbox/dcim/forms/bulk_import.py:1659 -#: netbox/dcim/forms/bulk_import.py:1663 netbox/dcim/forms/filtersets.py:123 +#: netbox/dcim/forms/bulk_import.py:653 netbox/dcim/forms/bulk_import.py:1706 +#: netbox/dcim/forms/bulk_import.py:1710 netbox/dcim/forms/filtersets.py:123 #: netbox/dcim/forms/filtersets.py:359 netbox/dcim/forms/filtersets.py:448 #: netbox/dcim/forms/filtersets.py:462 netbox/dcim/forms/filtersets.py:501 #: netbox/dcim/forms/filtersets.py:874 netbox/dcim/forms/filtersets.py:1086 @@ -4363,7 +4363,7 @@ msgstr "Şema" #: netbox/dcim/forms/bulk_edit.py:555 netbox/dcim/forms/bulk_edit.py:562 #: netbox/dcim/forms/bulk_edit.py:793 netbox/dcim/forms/bulk_import.py:460 -#: netbox/dcim/forms/bulk_import.py:1459 netbox/dcim/forms/filtersets.py:690 +#: netbox/dcim/forms/bulk_import.py:1475 netbox/dcim/forms/filtersets.py:690 #: netbox/dcim/forms/filtersets.py:1215 netbox/dcim/forms/model_forms.py:444 #: netbox/dcim/forms/model_forms.py:457 netbox/dcim/tables/modules.py:43 #: netbox/extras/forms/filtersets.py:413 @@ -4488,8 +4488,8 @@ msgstr "etiket" msgid "Length" msgstr "Uzunluk" -#: netbox/dcim/forms/bulk_edit.py:818 netbox/dcim/forms/bulk_import.py:1478 -#: netbox/dcim/forms/bulk_import.py:1481 netbox/dcim/forms/filtersets.py:1228 +#: netbox/dcim/forms/bulk_edit.py:818 netbox/dcim/forms/bulk_import.py:1494 +#: netbox/dcim/forms/bulk_import.py:1497 netbox/dcim/forms/filtersets.py:1228 msgid "Length unit" msgstr "Uzunluk birimi" @@ -4497,17 +4497,17 @@ msgstr "Uzunluk birimi" msgid "Domain" msgstr "Alan adı" -#: netbox/dcim/forms/bulk_edit.py:892 netbox/dcim/forms/bulk_import.py:1646 +#: netbox/dcim/forms/bulk_edit.py:892 netbox/dcim/forms/bulk_import.py:1693 #: netbox/dcim/forms/filtersets.py:1316 netbox/dcim/forms/model_forms.py:891 msgid "Power panel" msgstr "Güç paneli" -#: netbox/dcim/forms/bulk_edit.py:914 netbox/dcim/forms/bulk_import.py:1682 +#: netbox/dcim/forms/bulk_edit.py:914 netbox/dcim/forms/bulk_import.py:1729 #: netbox/dcim/forms/filtersets.py:1338 msgid "Supply" msgstr "Tedarik" -#: netbox/dcim/forms/bulk_edit.py:920 netbox/dcim/forms/bulk_import.py:1687 +#: netbox/dcim/forms/bulk_edit.py:920 netbox/dcim/forms/bulk_import.py:1734 #: netbox/dcim/forms/filtersets.py:1343 msgid "Phase" msgstr "Faz" @@ -4738,7 +4738,7 @@ msgid "available options" msgstr "mevcut seçenekler" #: netbox/dcim/forms/bulk_import.py:149 netbox/dcim/forms/bulk_import.py:643 -#: netbox/dcim/forms/bulk_import.py:1643 netbox/ipam/forms/bulk_import.py:512 +#: netbox/dcim/forms/bulk_import.py:1690 netbox/ipam/forms/bulk_import.py:512 #: netbox/virtualization/forms/bulk_import.py:64 #: netbox/virtualization/forms/bulk_import.py:102 msgid "Assigned site" @@ -4801,7 +4801,7 @@ msgstr "Bir raf tipi belirtilmiyorsa U yüksekliği ayarlanmalıdır." msgid "Parent site" msgstr "Ana site" -#: netbox/dcim/forms/bulk_import.py:359 netbox/dcim/forms/bulk_import.py:1656 +#: netbox/dcim/forms/bulk_import.py:359 netbox/dcim/forms/bulk_import.py:1703 msgid "Rack's location (if any)" msgstr "Rafın konumu (varsa)" @@ -4867,7 +4867,7 @@ msgstr "Platform bulunamadı." msgid "Limit platform assignments to this manufacturer" msgstr "Platform atamalarını bu üreticiye sınırlayın" -#: netbox/dcim/forms/bulk_import.py:576 netbox/dcim/forms/bulk_import.py:1725 +#: netbox/dcim/forms/bulk_import.py:576 netbox/dcim/forms/bulk_import.py:1772 #: netbox/tenancy/forms/bulk_import.py:116 msgid "Assigned role" msgstr "Atanan rol" @@ -5076,7 +5076,7 @@ msgid "VDC {vdc} is not assigned to device {device}" msgstr "VDC {vdc} cihaza atanmadı {device}" #: netbox/dcim/forms/bulk_import.py:1103 netbox/dcim/forms/bulk_import.py:1121 -#: netbox/dcim/forms/bulk_import.py:1468 +#: netbox/dcim/forms/bulk_import.py:1484 msgid "Physical medium classification" msgstr "Fiziksel ortam sınıflandırması" @@ -5173,68 +5173,91 @@ msgstr "Ana cihaz A'nın sitesi (varsa)" msgid "Side A device" msgstr "A Tarafı Cihazı" -#: netbox/dcim/forms/bulk_import.py:1413 netbox/dcim/forms/bulk_import.py:1438 -msgid "Device name" -msgstr "Cihaz adı" +#: netbox/dcim/forms/bulk_import.py:1414 netbox/dcim/forms/bulk_import.py:1447 +msgid "Device name (for device component terminations)" +msgstr "" -#: netbox/dcim/forms/bulk_import.py:1416 +#: netbox/dcim/forms/bulk_import.py:1417 +msgid "Side A power panel" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1421 netbox/dcim/forms/bulk_import.py:1454 +msgid "Power panel name (for power feed terminations)" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1424 msgid "Side A type" msgstr "Taraf A tipi" -#: netbox/dcim/forms/bulk_import.py:1422 +#: netbox/dcim/forms/bulk_import.py:1430 msgid "Side A name" msgstr "A Tarafı adı" -#: netbox/dcim/forms/bulk_import.py:1423 netbox/dcim/forms/bulk_import.py:1448 +#: netbox/dcim/forms/bulk_import.py:1431 netbox/dcim/forms/bulk_import.py:1464 msgid "Termination name" msgstr "Fesih adı" -#: netbox/dcim/forms/bulk_import.py:1428 +#: netbox/dcim/forms/bulk_import.py:1436 msgid "Side B site" msgstr "B tarafı sitesi" -#: netbox/dcim/forms/bulk_import.py:1432 +#: netbox/dcim/forms/bulk_import.py:1440 #: netbox/wireless/forms/bulk_import.py:114 msgid "Site of parent device B (if any)" msgstr "Ana cihaz B sitesi (varsa)" -#: netbox/dcim/forms/bulk_import.py:1435 +#: netbox/dcim/forms/bulk_import.py:1443 msgid "Side B device" msgstr "B tarafı cihazı" -#: netbox/dcim/forms/bulk_import.py:1441 +#: netbox/dcim/forms/bulk_import.py:1450 +msgid "Side B power panel" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1457 msgid "Side B type" msgstr "Taraf B tipi" -#: netbox/dcim/forms/bulk_import.py:1447 +#: netbox/dcim/forms/bulk_import.py:1463 msgid "Side B name" msgstr "B tarafı adı" -#: netbox/dcim/forms/bulk_import.py:1456 +#: netbox/dcim/forms/bulk_import.py:1472 #: netbox/templates/dcim/panels/connection.html:60 #: netbox/wireless/forms/bulk_import.py:133 msgid "Connection status" msgstr "Bağlantı durumu" -#: netbox/dcim/forms/bulk_import.py:1462 +#: netbox/dcim/forms/bulk_import.py:1478 msgid "Cable connection profile" msgstr "Kablo bağlantı profili" -#: netbox/dcim/forms/bulk_import.py:1487 +#: netbox/dcim/forms/bulk_import.py:1503 msgid "Color name (e.g. \"Red\") or hex code (e.g. \"f44336\")" msgstr "Renk adı (örn. “Kırmızı”) veya altıgen kodu (örn. “f44336\")" -#: netbox/dcim/forms/bulk_import.py:1542 +#: netbox/dcim/forms/bulk_import.py:1564 +#, python-brace-format +msgid "" +"Side {side_upper}: {power_panel} {termination_object} is already connected" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1570 +#, python-brace-format +msgid "{side_upper} side termination not found: {power_panel} {name}" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1588 #, python-brace-format msgid "Side {side_upper}: {device} {termination_object} is already connected" msgstr "Yan {side_upper}: {device} {termination_object} zaten bağlı" -#: netbox/dcim/forms/bulk_import.py:1548 +#: netbox/dcim/forms/bulk_import.py:1594 #, python-brace-format msgid "{side_upper} side termination not found: {device} {name}" msgstr "{side_upper} yan sonlandırma bulunamadı: {device} {name}" -#: netbox/dcim/forms/bulk_import.py:1569 +#: netbox/dcim/forms/bulk_import.py:1616 #, python-brace-format msgid "" "{color} did not match any used color name and was longer than six " @@ -5243,53 +5266,53 @@ msgstr "" "{color} kullanılan herhangi bir renk adıyla eşleşmedi ve altı karakterden " "uzundu: geçersiz altıgen." -#: netbox/dcim/forms/bulk_import.py:1594 netbox/dcim/forms/model_forms.py:926 +#: netbox/dcim/forms/bulk_import.py:1641 netbox/dcim/forms/model_forms.py:926 #: netbox/dcim/tables/devices.py:1144 #: netbox/templates/dcim/panels/virtual_chassis_members.html:10 msgid "Master" msgstr "Usta" -#: netbox/dcim/forms/bulk_import.py:1598 +#: netbox/dcim/forms/bulk_import.py:1645 msgid "Master device" msgstr "Ana cihaz" -#: netbox/dcim/forms/bulk_import.py:1615 +#: netbox/dcim/forms/bulk_import.py:1662 msgid "Name of parent site" msgstr "Ana sitenin adı" -#: netbox/dcim/forms/bulk_import.py:1649 +#: netbox/dcim/forms/bulk_import.py:1696 msgid "Upstream power panel" msgstr "Yukarı akış güç paneli" -#: netbox/dcim/forms/bulk_import.py:1679 +#: netbox/dcim/forms/bulk_import.py:1726 msgid "Primary or redundant" msgstr "Birincil veya gereksiz" -#: netbox/dcim/forms/bulk_import.py:1684 +#: netbox/dcim/forms/bulk_import.py:1731 msgid "Supply type (AC/DC)" msgstr "Besleme tipi (AC/DC)" -#: netbox/dcim/forms/bulk_import.py:1689 +#: netbox/dcim/forms/bulk_import.py:1736 msgid "Single or three-phase" msgstr "Tek veya üç fazlı" -#: netbox/dcim/forms/bulk_import.py:1739 netbox/dcim/forms/model_forms.py:1901 +#: netbox/dcim/forms/bulk_import.py:1786 netbox/dcim/forms/model_forms.py:1901 #: netbox/dcim/ui/panels.py:110 netbox/dcim/ui/panels.py:354 #: netbox/virtualization/ui/panels.py:28 msgid "Primary IPv4" msgstr "Birincil IPv4" -#: netbox/dcim/forms/bulk_import.py:1743 +#: netbox/dcim/forms/bulk_import.py:1790 msgid "IPv4 address with mask, e.g. 1.2.3.4/24" msgstr "Maskeli IPv4 adresi, örn. 1.2.3.4/24" -#: netbox/dcim/forms/bulk_import.py:1746 netbox/dcim/forms/model_forms.py:1910 +#: netbox/dcim/forms/bulk_import.py:1793 netbox/dcim/forms/model_forms.py:1910 #: netbox/dcim/ui/panels.py:115 netbox/dcim/ui/panels.py:359 #: netbox/virtualization/ui/panels.py:33 msgid "Primary IPv6" msgstr "Birincil IPv6" -#: netbox/dcim/forms/bulk_import.py:1750 +#: netbox/dcim/forms/bulk_import.py:1797 msgid "IPv6 address with prefix length, e.g. 2001:db8::1/64" msgstr "Önek uzunluğuna sahip IPv6 adresi, örn. 2001:db8: :1/64" @@ -9999,23 +10022,23 @@ msgstr "abonelik" msgid "subscriptions" msgstr "abonelikler" -#: netbox/extras/models/scripts.py:43 +#: netbox/extras/models/scripts.py:41 msgid "is executable" msgstr "yürütülebilir" -#: netbox/extras/models/scripts.py:65 +#: netbox/extras/models/scripts.py:63 msgid "script" msgstr "senaryo" -#: netbox/extras/models/scripts.py:66 +#: netbox/extras/models/scripts.py:64 msgid "scripts" msgstr "senaryolar" -#: netbox/extras/models/scripts.py:112 +#: netbox/extras/models/scripts.py:110 msgid "script module" msgstr "komut dosyası modülü" -#: netbox/extras/models/scripts.py:113 +#: netbox/extras/models/scripts.py:111 msgid "script modules" msgstr "komut dosyası modülleri" diff --git a/netbox/translations/uk/LC_MESSAGES/django.mo b/netbox/translations/uk/LC_MESSAGES/django.mo index e22c3e894a2249d87c23f40bd5b0f0297e3e0aef..fbf03f29db5702b67406f0b019e68a1accf2c2b3 100644 GIT binary patch delta 73495 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 delta 73534 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 delta 73514 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 diff --git a/netbox/translations/zh/LC_MESSAGES/django.po b/netbox/translations/zh/LC_MESSAGES/django.po index 1dddcf8a1..8b7086227 100644 --- a/netbox/translations/zh/LC_MESSAGES/django.po +++ b/netbox/translations/zh/LC_MESSAGES/django.po @@ -24,7 +24,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-04-10 05:39+0000\n" +"POT-Creation-Date: 2026-04-14 05:39+0000\n" "PO-Revision-Date: 2023-10-30 17:48+0000\n" "Last-Translator: Jeremy Stretch, 2026\n" "Language-Team: Chinese (https://app.transifex.com/netbox-community/teams/178115/zh/)\n" @@ -189,8 +189,8 @@ msgstr "站点组(缩写)" #: netbox/dcim/forms/bulk_edit.py:329 netbox/dcim/forms/bulk_edit.py:679 #: netbox/dcim/forms/bulk_edit.py:866 netbox/dcim/forms/bulk_import.py:146 #: netbox/dcim/forms/bulk_import.py:247 netbox/dcim/forms/bulk_import.py:349 -#: netbox/dcim/forms/bulk_import.py:640 netbox/dcim/forms/bulk_import.py:1612 -#: netbox/dcim/forms/bulk_import.py:1640 netbox/dcim/forms/filtersets.py:106 +#: netbox/dcim/forms/bulk_import.py:640 netbox/dcim/forms/bulk_import.py:1659 +#: netbox/dcim/forms/bulk_import.py:1687 netbox/dcim/forms/filtersets.py:106 #: netbox/dcim/forms/filtersets.py:256 netbox/dcim/forms/filtersets.py:379 #: netbox/dcim/forms/filtersets.py:483 netbox/dcim/forms/filtersets.py:855 #: netbox/dcim/forms/filtersets.py:1073 netbox/dcim/forms/filtersets.py:1147 @@ -468,7 +468,7 @@ msgstr "服务ID" #: netbox/dcim/forms/bulk_edit.py:611 netbox/dcim/forms/bulk_edit.py:809 #: netbox/dcim/forms/bulk_edit.py:1063 netbox/dcim/forms/bulk_edit.py:1162 #: netbox/dcim/forms/bulk_edit.py:1189 netbox/dcim/forms/bulk_edit.py:1723 -#: netbox/dcim/forms/bulk_import.py:1484 netbox/dcim/forms/filtersets.py:1220 +#: netbox/dcim/forms/bulk_import.py:1500 netbox/dcim/forms/filtersets.py:1220 #: netbox/dcim/forms/filtersets.py:1545 netbox/dcim/forms/filtersets.py:1761 #: netbox/dcim/forms/filtersets.py:1780 netbox/dcim/forms/filtersets.py:1804 #: netbox/dcim/forms/filtersets.py:1823 netbox/dcim/tables/devices.py:806 @@ -500,8 +500,8 @@ msgstr "颜色" #: netbox/dcim/forms/bulk_import.py:813 netbox/dcim/forms/bulk_import.py:839 #: netbox/dcim/forms/bulk_import.py:865 netbox/dcim/forms/bulk_import.py:886 #: netbox/dcim/forms/bulk_import.py:972 netbox/dcim/forms/bulk_import.py:1101 -#: netbox/dcim/forms/bulk_import.py:1120 netbox/dcim/forms/bulk_import.py:1465 -#: netbox/dcim/forms/bulk_import.py:1677 netbox/dcim/forms/filtersets.py:1104 +#: netbox/dcim/forms/bulk_import.py:1120 netbox/dcim/forms/bulk_import.py:1481 +#: netbox/dcim/forms/bulk_import.py:1724 netbox/dcim/forms/filtersets.py:1104 #: netbox/dcim/forms/filtersets.py:1205 netbox/dcim/forms/filtersets.py:1333 #: netbox/dcim/forms/filtersets.py:1424 netbox/dcim/forms/filtersets.py:1444 #: netbox/dcim/forms/filtersets.py:1464 netbox/dcim/forms/filtersets.py:1484 @@ -559,8 +559,8 @@ msgstr "运营商账户" #: netbox/dcim/forms/bulk_import.py:103 netbox/dcim/forms/bulk_import.py:162 #: netbox/dcim/forms/bulk_import.py:265 netbox/dcim/forms/bulk_import.py:374 #: netbox/dcim/forms/bulk_import.py:605 netbox/dcim/forms/bulk_import.py:765 -#: netbox/dcim/forms/bulk_import.py:1230 netbox/dcim/forms/bulk_import.py:1453 -#: netbox/dcim/forms/bulk_import.py:1672 netbox/dcim/forms/bulk_import.py:1735 +#: netbox/dcim/forms/bulk_import.py:1230 netbox/dcim/forms/bulk_import.py:1469 +#: netbox/dcim/forms/bulk_import.py:1719 netbox/dcim/forms/bulk_import.py:1782 #: netbox/dcim/forms/filtersets.py:208 netbox/dcim/forms/filtersets.py:268 #: netbox/dcim/forms/filtersets.py:396 netbox/dcim/forms/filtersets.py:504 #: netbox/dcim/forms/filtersets.py:901 netbox/dcim/forms/filtersets.py:1024 @@ -621,8 +621,8 @@ msgstr "状态" #: netbox/dcim/forms/bulk_edit.py:799 netbox/dcim/forms/bulk_edit.py:1746 #: netbox/dcim/forms/bulk_import.py:122 netbox/dcim/forms/bulk_import.py:167 #: netbox/dcim/forms/bulk_import.py:258 netbox/dcim/forms/bulk_import.py:379 -#: netbox/dcim/forms/bulk_import.py:579 netbox/dcim/forms/bulk_import.py:1471 -#: netbox/dcim/forms/bulk_import.py:1728 netbox/dcim/forms/filtersets.py:143 +#: netbox/dcim/forms/bulk_import.py:579 netbox/dcim/forms/bulk_import.py:1487 +#: netbox/dcim/forms/bulk_import.py:1775 netbox/dcim/forms/filtersets.py:143 #: netbox/dcim/forms/filtersets.py:202 netbox/dcim/forms/filtersets.py:235 #: netbox/dcim/forms/filtersets.py:363 netbox/dcim/forms/filtersets.py:442 #: netbox/dcim/forms/filtersets.py:463 netbox/dcim/forms/filtersets.py:823 @@ -808,7 +808,7 @@ msgstr "描述" #: netbox/circuits/forms/bulk_edit.py:192 #: netbox/circuits/forms/model_forms.py:199 -#: netbox/dcim/forms/bulk_import.py:1419 netbox/dcim/forms/bulk_import.py:1444 +#: netbox/dcim/forms/bulk_import.py:1427 netbox/dcim/forms/bulk_import.py:1460 msgid "Termination type" msgstr "线缆接口类型" @@ -938,7 +938,7 @@ msgstr "线路类型" #: netbox/dcim/forms/bulk_import.py:105 netbox/dcim/forms/bulk_import.py:164 #: netbox/dcim/forms/bulk_import.py:267 netbox/dcim/forms/bulk_import.py:376 #: netbox/dcim/forms/bulk_import.py:607 netbox/dcim/forms/bulk_import.py:767 -#: netbox/dcim/forms/bulk_import.py:1232 netbox/dcim/forms/bulk_import.py:1674 +#: netbox/dcim/forms/bulk_import.py:1232 netbox/dcim/forms/bulk_import.py:1721 #: netbox/ipam/forms/bulk_import.py:200 netbox/ipam/forms/bulk_import.py:264 #: netbox/ipam/forms/bulk_import.py:300 netbox/ipam/forms/bulk_import.py:531 #: netbox/ipam/forms/bulk_import.py:544 @@ -954,8 +954,8 @@ msgstr "运行状态" #: netbox/circuits/forms/bulk_import.py:235 #: netbox/dcim/forms/bulk_import.py:126 netbox/dcim/forms/bulk_import.py:171 #: netbox/dcim/forms/bulk_import.py:383 netbox/dcim/forms/bulk_import.py:583 -#: netbox/dcim/forms/bulk_import.py:1475 netbox/dcim/forms/bulk_import.py:1669 -#: netbox/dcim/forms/bulk_import.py:1732 netbox/ipam/forms/bulk_import.py:49 +#: netbox/dcim/forms/bulk_import.py:1491 netbox/dcim/forms/bulk_import.py:1716 +#: netbox/dcim/forms/bulk_import.py:1779 netbox/ipam/forms/bulk_import.py:49 #: netbox/ipam/forms/bulk_import.py:78 netbox/ipam/forms/bulk_import.py:106 #: netbox/ipam/forms/bulk_import.py:126 netbox/ipam/forms/bulk_import.py:146 #: netbox/ipam/forms/bulk_import.py:174 netbox/ipam/forms/bulk_import.py:259 @@ -1028,8 +1028,8 @@ msgstr "接口" #: netbox/dcim/forms/bulk_edit.py:445 netbox/dcim/forms/bulk_edit.py:684 #: netbox/dcim/forms/bulk_edit.py:733 netbox/dcim/forms/bulk_edit.py:875 #: netbox/dcim/forms/bulk_import.py:252 netbox/dcim/forms/bulk_import.py:355 -#: netbox/dcim/forms/bulk_import.py:646 netbox/dcim/forms/bulk_import.py:1618 -#: netbox/dcim/forms/bulk_import.py:1652 netbox/dcim/forms/filtersets.py:114 +#: netbox/dcim/forms/bulk_import.py:646 netbox/dcim/forms/bulk_import.py:1665 +#: netbox/dcim/forms/bulk_import.py:1699 netbox/dcim/forms/filtersets.py:114 #: netbox/dcim/forms/filtersets.py:358 netbox/dcim/forms/filtersets.py:393 #: netbox/dcim/forms/filtersets.py:438 netbox/dcim/forms/filtersets.py:491 #: netbox/dcim/forms/filtersets.py:820 netbox/dcim/forms/filtersets.py:864 @@ -1456,7 +1456,7 @@ msgstr "电路终端必须连接到终端对象。" #: netbox/extras/models/models.py:417 netbox/extras/models/models.py:482 #: netbox/extras/models/models.py:567 netbox/extras/models/models.py:692 #: netbox/extras/models/notifications.py:126 -#: netbox/extras/models/scripts.py:31 netbox/ipam/models/asns.py:18 +#: netbox/extras/models/scripts.py:29 netbox/ipam/models/asns.py:18 #: netbox/ipam/models/fhrp.py:24 netbox/ipam/models/services.py:51 #: netbox/ipam/models/services.py:80 netbox/ipam/models/vlans.py:38 #: netbox/ipam/models/vlans.py:217 netbox/ipam/models/vlans.py:363 @@ -1701,7 +1701,7 @@ msgstr "终端" #: netbox/dcim/forms/bulk_import.py:1096 netbox/dcim/forms/bulk_import.py:1115 #: netbox/dcim/forms/bulk_import.py:1134 netbox/dcim/forms/bulk_import.py:1146 #: netbox/dcim/forms/bulk_import.py:1194 netbox/dcim/forms/bulk_import.py:1316 -#: netbox/dcim/forms/bulk_import.py:1722 netbox/dcim/forms/connections.py:34 +#: netbox/dcim/forms/bulk_import.py:1769 netbox/dcim/forms/connections.py:34 #: netbox/dcim/forms/filtersets.py:156 netbox/dcim/forms/filtersets.py:1021 #: netbox/dcim/forms/filtersets.py:1054 netbox/dcim/forms/filtersets.py:1202 #: netbox/dcim/forms/filtersets.py:1418 netbox/dcim/forms/filtersets.py:1441 @@ -4293,8 +4293,8 @@ msgstr "气流方向" #: netbox/dcim/forms/bulk_edit.py:444 netbox/dcim/forms/bulk_edit.py:897 #: netbox/dcim/forms/bulk_import.py:362 netbox/dcim/forms/bulk_import.py:365 -#: netbox/dcim/forms/bulk_import.py:653 netbox/dcim/forms/bulk_import.py:1659 -#: netbox/dcim/forms/bulk_import.py:1663 netbox/dcim/forms/filtersets.py:123 +#: netbox/dcim/forms/bulk_import.py:653 netbox/dcim/forms/bulk_import.py:1706 +#: netbox/dcim/forms/bulk_import.py:1710 netbox/dcim/forms/filtersets.py:123 #: netbox/dcim/forms/filtersets.py:359 netbox/dcim/forms/filtersets.py:448 #: netbox/dcim/forms/filtersets.py:462 netbox/dcim/forms/filtersets.py:501 #: netbox/dcim/forms/filtersets.py:874 netbox/dcim/forms/filtersets.py:1086 @@ -4355,7 +4355,7 @@ msgstr "架构" #: netbox/dcim/forms/bulk_edit.py:555 netbox/dcim/forms/bulk_edit.py:562 #: netbox/dcim/forms/bulk_edit.py:793 netbox/dcim/forms/bulk_import.py:460 -#: netbox/dcim/forms/bulk_import.py:1459 netbox/dcim/forms/filtersets.py:690 +#: netbox/dcim/forms/bulk_import.py:1475 netbox/dcim/forms/filtersets.py:690 #: netbox/dcim/forms/filtersets.py:1215 netbox/dcim/forms/model_forms.py:444 #: netbox/dcim/forms/model_forms.py:457 netbox/dcim/tables/modules.py:43 #: netbox/extras/forms/filtersets.py:413 @@ -4480,8 +4480,8 @@ msgstr "标记" msgid "Length" msgstr "长度" -#: netbox/dcim/forms/bulk_edit.py:818 netbox/dcim/forms/bulk_import.py:1478 -#: netbox/dcim/forms/bulk_import.py:1481 netbox/dcim/forms/filtersets.py:1228 +#: netbox/dcim/forms/bulk_edit.py:818 netbox/dcim/forms/bulk_import.py:1494 +#: netbox/dcim/forms/bulk_import.py:1497 netbox/dcim/forms/filtersets.py:1228 msgid "Length unit" msgstr "长度单位" @@ -4489,17 +4489,17 @@ msgstr "长度单位" msgid "Domain" msgstr "域" -#: netbox/dcim/forms/bulk_edit.py:892 netbox/dcim/forms/bulk_import.py:1646 +#: netbox/dcim/forms/bulk_edit.py:892 netbox/dcim/forms/bulk_import.py:1693 #: netbox/dcim/forms/filtersets.py:1316 netbox/dcim/forms/model_forms.py:891 msgid "Power panel" msgstr "电源面版" -#: netbox/dcim/forms/bulk_edit.py:914 netbox/dcim/forms/bulk_import.py:1682 +#: netbox/dcim/forms/bulk_edit.py:914 netbox/dcim/forms/bulk_import.py:1729 #: netbox/dcim/forms/filtersets.py:1338 msgid "Supply" msgstr "供应" -#: netbox/dcim/forms/bulk_edit.py:920 netbox/dcim/forms/bulk_import.py:1687 +#: netbox/dcim/forms/bulk_edit.py:920 netbox/dcim/forms/bulk_import.py:1734 #: netbox/dcim/forms/filtersets.py:1343 msgid "Phase" msgstr "相位" @@ -4730,7 +4730,7 @@ msgid "available options" msgstr "可用选项" #: netbox/dcim/forms/bulk_import.py:149 netbox/dcim/forms/bulk_import.py:643 -#: netbox/dcim/forms/bulk_import.py:1643 netbox/ipam/forms/bulk_import.py:512 +#: netbox/dcim/forms/bulk_import.py:1690 netbox/ipam/forms/bulk_import.py:512 #: netbox/virtualization/forms/bulk_import.py:64 #: netbox/virtualization/forms/bulk_import.py:102 msgid "Assigned site" @@ -4793,7 +4793,7 @@ msgstr "如果未指定机架类型,则必须设置 U 高度。" msgid "Parent site" msgstr "上一级站点" -#: netbox/dcim/forms/bulk_import.py:359 netbox/dcim/forms/bulk_import.py:1656 +#: netbox/dcim/forms/bulk_import.py:359 netbox/dcim/forms/bulk_import.py:1703 msgid "Rack's location (if any)" msgstr "机柜所在位置(如果有)" @@ -4859,7 +4859,7 @@ msgstr "未找到操作系统" msgid "Limit platform assignments to this manufacturer" msgstr "限定此系统平台的制造商" -#: netbox/dcim/forms/bulk_import.py:576 netbox/dcim/forms/bulk_import.py:1725 +#: netbox/dcim/forms/bulk_import.py:576 netbox/dcim/forms/bulk_import.py:1772 #: netbox/tenancy/forms/bulk_import.py:116 msgid "Assigned role" msgstr "指定规则" @@ -5062,7 +5062,7 @@ msgid "VDC {vdc} is not assigned to device {device}" msgstr "VDC {vdc} 没有指定给设备 {device}" #: netbox/dcim/forms/bulk_import.py:1103 netbox/dcim/forms/bulk_import.py:1121 -#: netbox/dcim/forms/bulk_import.py:1468 +#: netbox/dcim/forms/bulk_import.py:1484 msgid "Physical medium classification" msgstr "物理端口类型" @@ -5159,121 +5159,144 @@ msgstr "父设备 A 的站点(如果有)" msgid "Side A device" msgstr "A端设备" -#: netbox/dcim/forms/bulk_import.py:1413 netbox/dcim/forms/bulk_import.py:1438 -msgid "Device name" -msgstr "设备名字" +#: netbox/dcim/forms/bulk_import.py:1414 netbox/dcim/forms/bulk_import.py:1447 +msgid "Device name (for device component terminations)" +msgstr "" -#: netbox/dcim/forms/bulk_import.py:1416 +#: netbox/dcim/forms/bulk_import.py:1417 +msgid "Side A power panel" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1421 netbox/dcim/forms/bulk_import.py:1454 +msgid "Power panel name (for power feed terminations)" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1424 msgid "Side A type" msgstr "A端线缆类型" -#: netbox/dcim/forms/bulk_import.py:1422 +#: netbox/dcim/forms/bulk_import.py:1430 msgid "Side A name" msgstr "A端设备名称" -#: netbox/dcim/forms/bulk_import.py:1423 netbox/dcim/forms/bulk_import.py:1448 +#: netbox/dcim/forms/bulk_import.py:1431 netbox/dcim/forms/bulk_import.py:1464 msgid "Termination name" msgstr "线缆类型名称" -#: netbox/dcim/forms/bulk_import.py:1428 +#: netbox/dcim/forms/bulk_import.py:1436 msgid "Side B site" msgstr "B 侧网站" -#: netbox/dcim/forms/bulk_import.py:1432 +#: netbox/dcim/forms/bulk_import.py:1440 #: netbox/wireless/forms/bulk_import.py:114 msgid "Site of parent device B (if any)" msgstr "父设备 B 的站点(如果有)" -#: netbox/dcim/forms/bulk_import.py:1435 +#: netbox/dcim/forms/bulk_import.py:1443 msgid "Side B device" msgstr "B端设备" -#: netbox/dcim/forms/bulk_import.py:1441 +#: netbox/dcim/forms/bulk_import.py:1450 +msgid "Side B power panel" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1457 msgid "Side B type" msgstr "B端线缆类型" -#: netbox/dcim/forms/bulk_import.py:1447 +#: netbox/dcim/forms/bulk_import.py:1463 msgid "Side B name" msgstr "B端设备名称" -#: netbox/dcim/forms/bulk_import.py:1456 +#: netbox/dcim/forms/bulk_import.py:1472 #: netbox/templates/dcim/panels/connection.html:60 #: netbox/wireless/forms/bulk_import.py:133 msgid "Connection status" msgstr "连接状态" -#: netbox/dcim/forms/bulk_import.py:1462 +#: netbox/dcim/forms/bulk_import.py:1478 msgid "Cable connection profile" msgstr "电缆连接配置文件" -#: netbox/dcim/forms/bulk_import.py:1487 +#: netbox/dcim/forms/bulk_import.py:1503 msgid "Color name (e.g. \"Red\") or hex code (e.g. \"f44336\")" msgstr "颜色名称(例如 “红色”)或十六进制代码(例如 “f44336”)" -#: netbox/dcim/forms/bulk_import.py:1542 +#: netbox/dcim/forms/bulk_import.py:1564 +#, python-brace-format +msgid "" +"Side {side_upper}: {power_panel} {termination_object} is already connected" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1570 +#, python-brace-format +msgid "{side_upper} side termination not found: {power_panel} {name}" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1588 #, python-brace-format msgid "Side {side_upper}: {device} {termination_object} is already connected" msgstr " {side_upper}端: {device} {termination_object}已连接" -#: netbox/dcim/forms/bulk_import.py:1548 +#: netbox/dcim/forms/bulk_import.py:1594 #, python-brace-format msgid "{side_upper} side termination not found: {device} {name}" msgstr "{side_upper} 端接口类型未发现: {device} {name}" -#: netbox/dcim/forms/bulk_import.py:1569 +#: netbox/dcim/forms/bulk_import.py:1616 #, python-brace-format msgid "" "{color} did not match any used color name and was longer than six " "characters: invalid hex." msgstr "{color} 与任何使用的颜色名称都不匹配且长度超过六个字符:十六进制无效。" -#: netbox/dcim/forms/bulk_import.py:1594 netbox/dcim/forms/model_forms.py:926 +#: netbox/dcim/forms/bulk_import.py:1641 netbox/dcim/forms/model_forms.py:926 #: netbox/dcim/tables/devices.py:1144 #: netbox/templates/dcim/panels/virtual_chassis_members.html:10 msgid "Master" msgstr "Master" -#: netbox/dcim/forms/bulk_import.py:1598 +#: netbox/dcim/forms/bulk_import.py:1645 msgid "Master device" msgstr "主设备" -#: netbox/dcim/forms/bulk_import.py:1615 +#: netbox/dcim/forms/bulk_import.py:1662 msgid "Name of parent site" msgstr "父站点名称" -#: netbox/dcim/forms/bulk_import.py:1649 +#: netbox/dcim/forms/bulk_import.py:1696 msgid "Upstream power panel" msgstr "上一级电源面板" -#: netbox/dcim/forms/bulk_import.py:1679 +#: netbox/dcim/forms/bulk_import.py:1726 msgid "Primary or redundant" msgstr "主线路/备用线路" -#: netbox/dcim/forms/bulk_import.py:1684 +#: netbox/dcim/forms/bulk_import.py:1731 msgid "Supply type (AC/DC)" msgstr "供应类型(AC/DC)" -#: netbox/dcim/forms/bulk_import.py:1689 +#: netbox/dcim/forms/bulk_import.py:1736 msgid "Single or three-phase" msgstr "单相或三相" -#: netbox/dcim/forms/bulk_import.py:1739 netbox/dcim/forms/model_forms.py:1901 +#: netbox/dcim/forms/bulk_import.py:1786 netbox/dcim/forms/model_forms.py:1901 #: netbox/dcim/ui/panels.py:110 netbox/dcim/ui/panels.py:354 #: netbox/virtualization/ui/panels.py:28 msgid "Primary IPv4" msgstr "主 IPv4" -#: netbox/dcim/forms/bulk_import.py:1743 +#: netbox/dcim/forms/bulk_import.py:1790 msgid "IPv4 address with mask, e.g. 1.2.3.4/24" msgstr "带掩码的 IPv4 地址,例如 1.2.3.4/24" -#: netbox/dcim/forms/bulk_import.py:1746 netbox/dcim/forms/model_forms.py:1910 +#: netbox/dcim/forms/bulk_import.py:1793 netbox/dcim/forms/model_forms.py:1910 #: netbox/dcim/ui/panels.py:115 netbox/dcim/ui/panels.py:359 #: netbox/virtualization/ui/panels.py:33 msgid "Primary IPv6" msgstr "主 IPv6" -#: netbox/dcim/forms/bulk_import.py:1750 +#: netbox/dcim/forms/bulk_import.py:1797 msgid "IPv6 address with prefix length, e.g. 2001:db8::1/64" msgstr "带有前缀长度的 IPv6 地址,例如 2001:db8:: 1/64" @@ -9825,23 +9848,23 @@ msgstr "订阅" msgid "subscriptions" msgstr "订阅" -#: netbox/extras/models/scripts.py:43 +#: netbox/extras/models/scripts.py:41 msgid "is executable" msgstr "是可执行的" -#: netbox/extras/models/scripts.py:65 +#: netbox/extras/models/scripts.py:63 msgid "script" msgstr "脚本" -#: netbox/extras/models/scripts.py:66 +#: netbox/extras/models/scripts.py:64 msgid "scripts" msgstr "脚本" -#: netbox/extras/models/scripts.py:112 +#: netbox/extras/models/scripts.py:110 msgid "script module" msgstr "脚本模块" -#: netbox/extras/models/scripts.py:113 +#: netbox/extras/models/scripts.py:111 msgid "script modules" msgstr "脚本模块" diff --git a/pyproject.toml b/pyproject.toml index b0e829362..435473c8d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,14 +3,14 @@ [project] name = "netbox" -version = "4.5.8" +version = "4.6.0-beta1" requires-python = ">=3.12" description = "The premier source of truth powering network automation." readme = "README.md" license = "Apache-2.0" license-files = ["LICENSE.txt"] classifiers = [ - "Development Status :: 5 - Production/Stable", + "Development Status :: 4 - Beta", "Framework :: Django", "Natural Language :: English", "Programming Language :: Python", diff --git a/requirements.txt b/requirements.txt index b4acf9902..3aad00c06 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ colorama==0.4.6 -Django==6.0.3 +Django==6.0.4 django-cors-headers==4.9.0 django-debug-toolbar==6.3.0 django-filter==25.2 @@ -15,7 +15,7 @@ django-storages==1.14.6 django-tables2==2.8.0 django-taggit==6.1.0 django-timezone-field==7.2.1 -djangorestframework==3.16.1 +djangorestframework==3.17.1 drf-spectacular==0.29.0 drf-spectacular-sidecar==2026.4.1 feedparser==6.0.12 @@ -42,4 +42,4 @@ strawberry-graphql-django==0.82.1 svgwrite==1.4.3 tablib==3.9.0 tzdata==2026.1 -zensical==0.0.28 +zensical==0.0.33 From af7a35f83600d062e74cbf27eb88d4b859fcc922 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 16 Apr 2026 15:33:11 -0400 Subject: [PATCH 079/104] Closes #21936: Deprecate `LOGIN_REQUIRED` (#21941) Closes #21936: Deprecate LOGIN_REQUIRED --- docs/configuration/security.md | 3 +++ docs/release-notes/version-4.6.md | 1 + netbox/netbox/configuration_example.py | 3 --- netbox/netbox/settings.py | 25 ++++++++++++++++++++++--- 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/docs/configuration/security.md b/docs/configuration/security.md index f7d7821f3..3fc789f4c 100644 --- a/docs/configuration/security.md +++ b/docs/configuration/security.md @@ -161,6 +161,9 @@ Note that enabling this setting causes NetBox to update a user's session in the ## LOGIN_REQUIRED +!!! warning "Legacy Configuration Parameter" + The `LOGIN_REQUIRED` configuration parameter is deprecated and will be removed in NetBox v5.0. Unauthenticated access to the application will no longer be supported once this configuration parameter is removed. + Default: `True` When enabled, only authenticated users are permitted to access any part of NetBox. Disabling this will allow unauthenticated users to access most areas of NetBox (but not make any changes). diff --git a/docs/release-notes/version-4.6.md b/docs/release-notes/version-4.6.md index 19df0b4d6..0ad22e485 100644 --- a/docs/release-notes/version-4.6.md +++ b/docs/release-notes/version-4.6.md @@ -70,6 +70,7 @@ A new `start` query parameter has been introduced as an efficient alternative to * [#21884](https://github.com/netbox-community/netbox/issues/21884) - Deprecate the obsolete `DEFAULT_ACTION_PERMISSIONS` mapping * [#21887](https://github.com/netbox-community/netbox/issues/21887) - Deprecate support for legacy view actions * [#21890](https://github.com/netbox-community/netbox/issues/21890) - Deprecate `models` key in application registry +* [#21936](https://github.com/netbox-community/netbox/issues/21936) - Deprecate the `LOGIN_REQUIRED` configuration parameter ### Other Changes diff --git a/netbox/netbox/configuration_example.py b/netbox/netbox/configuration_example.py index 3971c69b5..27b11608a 100644 --- a/netbox/netbox/configuration_example.py +++ b/netbox/netbox/configuration_example.py @@ -162,9 +162,6 @@ LOGGING = {} # authenticated to NetBox indefinitely. LOGIN_PERSISTENCE = False -# Setting this to False will permit unauthenticated users to access most areas of NetBox (but not make any changes). -LOGIN_REQUIRED = True - # The length of time (in seconds) for which a user will remain logged into the web UI before being prompted to # re-authenticate. (Default: 1209600 [14 days]) LOGIN_TIMEOUT = None diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 67fe807b4..0258b6221 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -243,6 +243,20 @@ for path in PROXY_ROUTERS: except ImportError: raise ImproperlyConfigured(f"Invalid path in PROXY_ROUTERS: {path}") +# Warn on the presence of deprecated configuration parameters +if not LOGIN_REQUIRED: + warnings.warn( + "LOGIN_REQUIRED is deprecated and will be removed in NetBox v5.0. Unauthenticated access to the application " + "will no longer be supported. Please plan to require authentication for all users before upgrading.", + DeprecationWarning, + ) +elif hasattr(configuration, 'LOGIN_REQUIRED'): + warnings.warn( + "LOGIN_REQUIRED is deprecated and will be removed in NetBox v5.0. This parameter can be removed from your " + "configuration file.", + DeprecationWarning, + ) + # # Database @@ -270,12 +284,14 @@ if STORAGE_BACKEND is not None: ) else: warnings.warn( - "STORAGE_BACKEND is deprecated, use the new STORAGES setting instead." + "STORAGE_BACKEND is deprecated, use the new STORAGES setting instead.", + DeprecationWarning, ) if STORAGE_CONFIG is not None: warnings.warn( - "STORAGE_CONFIG is deprecated, use the new STORAGES setting instead." + "STORAGE_CONFIG is deprecated, use the new STORAGES setting instead.", + DeprecationWarning, ) # Default STORAGES for Django @@ -623,7 +639,10 @@ MAINTENANCE_EXEMPT_PATHS = ( # Warn on the presence of deprecated Sentry config parameters for config_param in ('SENTRY_DSN', 'SENTRY_SAMPLE_RATE', 'SENTRY_SEND_DEFAULT_PII', 'SENTRY_TRACES_SAMPLE_RATE'): if hasattr(configuration, config_param): - warnings.warn(f"{config_param} is deprecated and will be removed in NetBox v4.7. Use SENTRY_CONFIG instead.") + warnings.warn( + f"{config_param} is deprecated and will be removed in NetBox v4.7. Use SENTRY_CONFIG instead.", + DeprecationWarning, + ) if SENTRY_ENABLED: try: From 93fdcaf34ee2c7d636e09d53e9fd84486fcc9eee Mon Sep 17 00:00:00 2001 From: Martin Hauser Date: Wed, 15 Apr 2026 19:35:06 +0200 Subject: [PATCH 080/104] perf(dcim): Batch peer termination lookups in Cable Path Tracing Add `get_peer_terminations()` to resolve multiple cable terminations in a single query, reducing N+1 queries during path tracing. Update path resolution to use batched lookup and deduplicate peers by identity. Fixes #21688 --- netbox/dcim/cable_profiles.py | 100 ++++++++++- netbox/dcim/models/cables.py | 29 +++- netbox/dcim/tests/test_cable_profiles.py | 208 +++++++++++++++++++++++ netbox/dcim/tests/test_cablepaths2.py | 93 ++++++++++ 4 files changed, 419 insertions(+), 11 deletions(-) create mode 100644 netbox/dcim/tests/test_cable_profiles.py diff --git a/netbox/dcim/cable_profiles.py b/netbox/dcim/cable_profiles.py index 8945370f2..921392dc0 100644 --- a/netbox/dcim/cable_profiles.py +++ b/netbox/dcim/cable_profiles.py @@ -1,9 +1,14 @@ +from collections import defaultdict, namedtuple + from django.core.exceptions import ValidationError +from django.db.models import Q from django.utils.translation import gettext_lazy as _ from dcim.choices import CableEndChoices from dcim.models import CableTermination +PeerLookupKey = namedtuple('PeerLookupKey', ['cable_id', 'cable_end', 'connector', 'position']) + class BaseCableProfile: """Base class for representing a cable profile.""" @@ -55,9 +60,14 @@ class BaseCableProfile: return self._mapping.get((connector, position)) return connector, position - def get_peer_termination(self, termination, position): + # + # Peer termination resolution + # + + def _get_peer_lookup_key(self, termination, position): """ - Given a terminating object, return the peer terminating object (if any) on the opposite end of the cable. + Given a cabled object and a local position, return the (cable_id, cable_end, connector, position) + tuple identifying the corresponding peer CableTermination on the opposite end of the cable. """ try: connector, position = self.get_mapped_position( @@ -70,10 +80,17 @@ class BaseCableProfile: f"Could not map connector {termination.cable_connector} position {position} on side " f"{termination.cable_end}" ) + return PeerLookupKey(termination.cable_id, termination.opposite_cable_end, connector, position) + + def get_peer_termination(self, termination, position): + """ + Given a terminating object, return the peer terminating object (if any) on the opposite end of the cable. + """ + cable_id, cable_end, connector, position = self._get_peer_lookup_key(termination, position) try: ct = CableTermination.objects.get( - cable=termination.cable, - cable_end=termination.opposite_cable_end, + cable_id=cable_id, + cable_end=cable_end, connector=connector, positions__contains=[position], ) @@ -81,6 +98,81 @@ class BaseCableProfile: except CableTermination.DoesNotExist: return None, None + def get_peer_terminations(self, term_position_pairs): + """ + Resolve a batch of (termination, position) pairs to peer terminations. + """ + if not term_position_pairs: + return [] + + # Fast path: a single pair doesn't benefit from batching + if len(term_position_pairs) == 1: + return [self.get_peer_termination(*term_position_pairs[0])] + + lookup_keys = [ + self._get_peer_lookup_key(termination, position) for termination, position in term_position_pairs + ] + + # Group requested positions by (cable_id, cable_end, connector) so we can + # build one overlap clause per group instead of one clause per position. + positions_by_group = defaultdict(set) + for key in lookup_keys: + positions_by_group[(key.cable_id, key.cable_end, key.connector)].add(key.position) + + q_filter = Q() + for (cable_id, cable_end, connector), positions in positions_by_group.items(): + q_filter |= Q( + cable_id=cable_id, + cable_end=cable_end, + connector=connector, + positions__overlap=list(positions), + ) + + peer_ct_by_key = {} + term_ids_by_type = defaultdict(set) + model_by_type = {} + + for ct in CableTermination.objects.filter(q_filter).select_related('termination_type'): + model_by_type[ct.termination_type_id] = ct.termination_type.model_class() + term_ids_by_type[ct.termination_type_id].add(ct.termination_id) + + group_key = (ct.cable_id, ct.cable_end, ct.connector) + requested_positions = positions_by_group.get(group_key, ()) + + # The overlap query may return a termination carrying additional + # positions, so only index the positions we actually requested. + for pos in ct.positions or []: + if pos not in requested_positions: + continue + + key = PeerLookupKey(ct.cable_id, ct.cable_end, ct.connector, pos) + if key in peer_ct_by_key and peer_ct_by_key[key].pk != ct.pk: + raise CableTermination.MultipleObjectsReturned( + f"Multiple peer terminations found for cable {ct.cable_id} end {ct.cable_end} " + f"connector {ct.connector} position {pos}" + ) + peer_ct_by_key[key] = ct + + # Use _base_manager to ensure all termination objects are loaded + # regardless of any custom default manager filters (e.g. soft-delete). + # Note: Django's GenericForeignKey / ContentType.get_object_for_this_type() + # uses _default_manager, but _base_manager is safer for bulk resolution + # during path tracing. + term_by_type = { + type_id: model_by_type[type_id]._base_manager.in_bulk(ids) for type_id, ids in term_ids_by_type.items() + } + + results = [] + for key in lookup_keys: + ct = peer_ct_by_key.get(key) + if ct is None: + results.append((None, None)) + else: + termination = term_by_type[ct.termination_type_id].get(ct.termination_id) + results.append((termination, key.position if termination is not None else None)) + + return results + @staticmethod def get_position_list(n): """Return a list of integers from 1 to n, inclusive.""" diff --git a/netbox/dcim/models/cables.py b/netbox/dcim/models/cables.py index 4b7a30852..06b5606bc 100644 --- a/netbox/dcim/models/cables.py +++ b/netbox/dcim/models/cables.py @@ -1,5 +1,6 @@ import itertools import logging +from collections import Counter from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.models import ContentType @@ -907,25 +908,37 @@ class CablePath(models.Model): # Build (termination, position) pairs by matching stacked positions # to each termination's cable_positions. This correctly handles # multiple terminations on different connectors of the same cable. - remaining = list(positions) + remaining = Counter(positions) term_position_pairs = [] for term in terminations: if term.cable_positions: for cp in term.cable_positions: - if cp in remaining: + if remaining[cp]: term_position_pairs.append((term, cp)) - remaining.remove(cp) + remaining[cp] -= 1 # Fallback for when positions don't match cable_positions # (e.g., empty position stack yielding [None]) if not term_position_pairs: term_position_pairs = [(terminations[0], pos) for pos in positions] - for term, pos in term_position_pairs: - peer, new_pos = cable_profile.get_peer_termination(term, pos) - if peer not in remote_terminations: + peer_results = cable_profile.get_peer_terminations(term_position_pairs) + seen = set() + for peer, new_pos in peer_results: + # Deduplicate peer terminations by model type & PK. + key = None if peer is None else (peer._meta.concrete_model, peer.pk) + if key not in seen: + seen.add(key) remote_terminations.append(peer) new_positions.append(new_pos) + + # If all peers resolved to None (no far-end terminations exist), + # treat as an empty result so the path is recorded as incomplete + # rather than falling through to the endpoint check with a stale + # None entry. + if remote_terminations and all(peer is None for peer in remote_terminations): + remote_terminations = [] + position_stack.append(new_positions) # Legacy (positionless) behavior @@ -945,7 +958,9 @@ class CablePath(models.Model): if not q_filter: break - remote_cable_terminations = CableTermination.objects.filter(q_filter) + remote_cable_terminations = CableTermination.objects.filter(q_filter).prefetch_related( + 'termination' + ) remote_terminations = [ct.termination for ct in remote_cable_terminations] else: # WirelessLink diff --git a/netbox/dcim/tests/test_cable_profiles.py b/netbox/dcim/tests/test_cable_profiles.py new file mode 100644 index 000000000..7f539c50a --- /dev/null +++ b/netbox/dcim/tests/test_cable_profiles.py @@ -0,0 +1,208 @@ +from dcim.cable_profiles import ( + Breakout1C4Px4C1PCableProfile, + Single1C1PCableProfile, + Single1C4PCableProfile, + Trunk2C2PCableProfile, + Trunk2C4PShuffleCableProfile, +) +from dcim.choices import CableProfileChoices +from dcim.models import Cable, Interface +from dcim.tests.utils import CablePathTestCase + + +class CableProfilePeerTerminationTests(CablePathTestCase): + """ + Tests for BaseCableProfile.get_peer_termination() and get_peer_terminations(). + Verifies that the batch method produces identical results to calling + the singular method in a loop. + """ + + @classmethod + def setUpTestData(cls): + super().setUpTestData() + + # Shared pool of interfaces — cables are created per-test since they + # mutate CableTerminations and cached fields on save. + cls.interfaces = [Interface(device=cls.device, name=f'Interface {i}') for i in range(1, 17)] + Interface.objects.bulk_create(cls.interfaces) + + def _assert_batch_matches_singular(self, cable_profile, term_position_pairs): + """ + Helper: assert get_peer_terminations() returns the same results as + calling get_peer_termination() individually for each pair. + """ + expected = [cable_profile.get_peer_termination(term, pos) for term, pos in term_position_pairs] + actual = cable_profile.get_peer_terminations(term_position_pairs) + self.assertEqual(len(actual), len(expected)) + for i, (exp, act) in enumerate(zip(expected, actual)): + exp_peer, exp_pos = exp + act_peer, act_pos = act + self.assertEqual( + (type(act_peer), getattr(act_peer, 'pk', None), act_pos), + (type(exp_peer), getattr(exp_peer, 'pk', None), exp_pos), + msg=f'Mismatch at index {i}: expected {exp}, got {act}', + ) + + def test_empty_pairs(self): + """ + get_peer_terminations() with an empty list returns an empty list. + """ + profile = Single1C1PCableProfile() + self.assertEqual(profile.get_peer_terminations([]), []) + + def test_single_pair_fast_path(self): + """ + A single-pair call should use the fast path and produce the same + result as get_peer_termination(). + """ + cable = Cable( + profile=CableProfileChoices.SINGLE_1C1P, + a_terminations=[self.interfaces[0]], + b_terminations=[self.interfaces[1]], + ) + cable.clean() + cable.save() + + self.interfaces[0].refresh_from_db() + profile = Single1C1PCableProfile() + + self._assert_batch_matches_singular(profile, [(self.interfaces[0], 1)]) + + def test_single_connector_multi_position(self): + """ + Batch resolution on a Single 1C4P profile should return the same + peers as individual lookups for each position. + """ + cable = Cable( + profile=CableProfileChoices.SINGLE_1C4P, + a_terminations=[self.interfaces[0]], + b_terminations=[self.interfaces[4]], + ) + cable.clean() + cable.save() + + self.interfaces[0].refresh_from_db() + profile = Single1C4PCableProfile() + + # Query all 4 positions from the A-side termination + pairs = [(self.interfaces[0], pos) for pos in range(1, 5)] + self._assert_batch_matches_singular(profile, pairs) + + def test_multi_connector_multi_position(self): + """ + Batch resolution on a Trunk 2C2P profile across both connectors + should match individual lookups. + """ + cable = Cable( + profile=CableProfileChoices.TRUNK_2C2P, + a_terminations=[self.interfaces[0], self.interfaces[1]], + b_terminations=[self.interfaces[2], self.interfaces[3]], + ) + cable.clean() + cable.save() + + for iface in self.interfaces[:4]: + iface.refresh_from_db() + profile = Trunk2C2PCableProfile() + + # Build pairs for both A-side terminations across their positions + pairs = [] + for iface in self.interfaces[:2]: + for pos in iface.cable_positions: + pairs.append((iface, pos)) + + self._assert_batch_matches_singular(profile, pairs) + + def test_shuffle_profile_mapping(self): + """ + Batch resolution on a shuffle profile should correctly apply the + non-linear position mapping. + """ + cable = Cable( + profile=CableProfileChoices.TRUNK_2C4P_SHUFFLE, + a_terminations=[self.interfaces[0], self.interfaces[1]], + b_terminations=[self.interfaces[2], self.interfaces[3]], + ) + cable.clean() + cable.save() + + for iface in self.interfaces[:4]: + iface.refresh_from_db() + profile = Trunk2C4PShuffleCableProfile() + + pairs = [] + for iface in self.interfaces[:2]: + for pos in iface.cable_positions: + pairs.append((iface, pos)) + + self._assert_batch_matches_singular(profile, pairs) + + def test_breakout_profile(self): + """ + Batch resolution on a breakout profile should correctly map A-side + positions to different B-side connectors. + """ + cable = Cable( + profile=CableProfileChoices.BREAKOUT_1C4P_4C1P, + a_terminations=[self.interfaces[8]], + b_terminations=self.interfaces[9:13], + ) + cable.clean() + cable.save() + + self.interfaces[8].refresh_from_db() + for iface in self.interfaces[9:13]: + iface.refresh_from_db() + profile = Breakout1C4Px4C1PCableProfile() + + # Test A→B direction (one connector, 4 positions → 4 connectors) + a_pairs = [(self.interfaces[8], pos) for pos in self.interfaces[8].cable_positions] + self._assert_batch_matches_singular(profile, a_pairs) + + # Test B→A direction (4 connectors, 1 position each → one connector) + b_pairs = [(iface, 1) for iface in self.interfaces[9:13]] + self._assert_batch_matches_singular(profile, b_pairs) + + def test_multi_position_single_termination(self): + """ + When a single-connector multi-position profile has only one termination + per side, all positions should resolve to the same peer object. The batch + method must return identical results to the singular method for each. + """ + # Use a multi-position profile but only connect one termination per side. + # The CableTermination will have positions=[1,2,3,4] but only one object + # is attached, so querying any position still resolves to that same peer. + cable = Cable( + profile=CableProfileChoices.SINGLE_1C4P, + a_terminations=[self.interfaces[0]], + b_terminations=[self.interfaces[1]], + ) + cable.clean() + cable.save() + + self.interfaces[0].refresh_from_db() + profile = Single1C4PCableProfile() + + # All 4 positions should resolve to the same B-side termination + pairs = [(self.interfaces[0], pos) for pos in range(1, 5)] + self._assert_batch_matches_singular(profile, pairs) + + def test_duplicate_pairs(self): + """ + Submitting the same (termination, position) pair multiple times should + return the correct result for each occurrence without errors. + """ + cable = Cable( + profile=CableProfileChoices.SINGLE_1C1P, + a_terminations=[self.interfaces[0]], + b_terminations=[self.interfaces[1]], + ) + cable.clean() + cable.save() + + self.interfaces[0].refresh_from_db() + profile = Single1C1PCableProfile() + + # The same pair submitted three times + pairs = [(self.interfaces[0], 1)] * 3 + self._assert_batch_matches_singular(profile, pairs) diff --git a/netbox/dcim/tests/test_cablepaths2.py b/netbox/dcim/tests/test_cablepaths2.py index 5efaee67c..68208ad07 100644 --- a/netbox/dcim/tests/test_cablepaths2.py +++ b/netbox/dcim/tests/test_cablepaths2.py @@ -14,6 +14,7 @@ class CablePathTests(CablePathTestCase): Tests are numbered as follows: 1XX: Test direct connections using each profile 2XX: Topology tests replicated from the legacy test case and adapted to use profiles + 3XX: Dynamic port mapping and termination changes """ def test_101_cable_profile_single_1c1p(self): @@ -1223,6 +1224,98 @@ class CablePathTests(CablePathTestCase): # Test SVG generation CableTraceSVG(interfaces[0]).render() + def test_110_partial_termination_profiled_trunk(self): + """ + Tests that tracing through a partially terminated profiled cable + produces a complete path for the connected pair and an incomplete + path for the unconnected pair, without errors. Also verifies that + attaching the missing termination completes the previously incomplete path. + + [IF1] --C1-- [IF3] + [IF2] (empty) + + Cable profile: Trunk 2C1P with only one B-side termination. + """ + interfaces = [ + Interface.objects.create(device=self.device, name='Interface 1'), + Interface.objects.create(device=self.device, name='Interface 2'), + Interface.objects.create(device=self.device, name='Interface 3'), + ] + + # Create a 2-connector trunk cable with both A-side connectors + # populated but only one B-side connector terminated. + cable1 = Cable( + profile=CableProfileChoices.TRUNK_2C1P, + a_terminations=[interfaces[0], interfaces[1]], + b_terminations=[interfaces[2]], + ) + cable1.clean() + cable1.save() + + # IF1 (connector 1) → IF3 (connector 1): complete path + path1 = self.assertPathExists( + (interfaces[0], cable1, interfaces[2]), + is_complete=True, + is_active=True, + ) + + # IF3 (connector 1) → IF1 (connector 1): complete path (reverse) + path2 = self.assertPathExists( + (interfaces[2], cable1, interfaces[0]), + is_complete=True, + is_active=True, + ) + + # IF2 (connector 2) has no B-side peer. + # Tracing should stop at this segment, and the resulting path + # should remain incomplete. + # Verify via the origin's _path reference rather than matching + # the exact path shape directly. + interfaces[1].refresh_from_db() + self.assertIsNotNone(interfaces[1]._path_id) + path3 = CablePath.objects.get(pk=interfaces[1]._path_id) + self.assertFalse(path3.is_complete) + self.assertTrue(path3.is_active) + + for iface in interfaces: + iface.refresh_from_db() + self.assertPathIsSet(interfaces[0], path1) + self.assertPathIsSet(interfaces[2], path2) + self.assertPathIsSet(interfaces[1], path3) + + # Verify connector/position assignments + self.assertEqual(interfaces[0].cable_connector, 1) + self.assertEqual(interfaces[0].cable_positions, [1]) + self.assertEqual(interfaces[1].cable_connector, 2) + self.assertEqual(interfaces[1].cable_positions, [1]) + self.assertEqual(interfaces[2].cable_connector, 1) + self.assertEqual(interfaces[2].cable_positions, [1]) + + # Now attach the missing B-side termination and verify the + # previously incomplete path becomes complete. + interface4 = Interface.objects.create(device=self.device, name='Interface 4') + cable1.b_terminations = [interfaces[2], interface4] + cable1.clean() + cable1.save() + + path4 = self.assertPathExists( + (interfaces[1], cable1, interface4), + is_complete=True, + is_active=True, + ) + path5 = self.assertPathExists( + (interface4, cable1, interfaces[1]), + is_complete=True, + is_active=True, + ) + + interfaces[1].refresh_from_db() + interface4.refresh_from_db() + self.assertPathIsSet(interfaces[1], path4) + self.assertPathIsSet(interface4, path5) + self.assertEqual(interface4.cable_connector, 2) + self.assertEqual(interface4.cable_positions, [1]) + def test_202_single_path_via_pass_through_with_breakouts(self): """ [IF1] --C1-- [FP1] [RP1] --C2-- [IF3] From 313b311962f85cab5c44a9379172913f56e73360 Mon Sep 17 00:00:00 2001 From: Martin Hauser Date: Mon, 20 Apr 2026 17:41:29 +0200 Subject: [PATCH 081/104] feat(ui): Refactor sticky bulk actions and form bars Replace ad-hoc btn-float-group classes with a data-attribute-driven sticky-actions system. Selection-driven bars use JS-toggled `.is-sticky-active`; always-visible bars are pure CSS. Remove obsolete `.btn-float` class usage from footer templates. Fixes #21924 --- netbox/project-static/dist/netbox.css | 2 +- netbox/project-static/dist/netbox.js | 8 +- netbox/project-static/dist/netbox.js.map | 6 +- .../project-static/src/buttons/floatBulk.ts | 113 +++++++++++++----- .../project-static/styles/custom/_misc.scss | 106 ++++++++++++---- netbox/templates/account/preferences.html | 11 +- netbox/templates/generic/bulk_edit.html | 8 +- netbox/templates/generic/object_children.html | 6 +- netbox/templates/generic/object_edit.html | 38 +++--- netbox/templates/generic/object_list.html | 7 +- netbox/templates/htmx/quick_add.html | 2 +- netbox/templates/htmx/table.html | 2 +- netbox/templates/inc/filter_list.html | 16 +-- 13 files changed, 225 insertions(+), 100 deletions(-) diff --git a/netbox/project-static/dist/netbox.css b/netbox/project-static/dist/netbox.css index 434660498..58c9c183c 100644 --- a/netbox/project-static/dist/netbox.css +++ b/netbox/project-static/dist/netbox.css @@ -1 +1 @@ -@charset "UTF-8";:root,[data-bs-theme=light]{--tblr-black: #000000;--tblr-white: #ffffff;--tblr-gray: #4b5563;--tblr-gray-dark: #1f2937;--tblr-gray-100: #f3f4f6;--tblr-gray-200: #e5e7eb;--tblr-gray-300: #d1d5db;--tblr-gray-400: #9ca3af;--tblr-gray-500: #6b7280;--tblr-gray-600: #4b5563;--tblr-gray-700: #374151;--tblr-gray-800: #1f2937;--tblr-gray-900: #111827;--tblr-primary: #00857D;--tblr-secondary: #6b7280;--tblr-success: #2fb344;--tblr-info: #4299e1;--tblr-warning: #f59f00;--tblr-danger: #d63939;--tblr-light: #f9fafb;--tblr-dark: #1f2937;--tblr-muted: #6b7280;--tblr-blue: #066fd1;--tblr-azure: #4299e1;--tblr-indigo: #4263eb;--tblr-purple: #ae3ec9;--tblr-pink: #d6336c;--tblr-red: #d63939;--tblr-orange: #f76707;--tblr-yellow: #f59f00;--tblr-lime: #74b816;--tblr-green: #2fb344;--tblr-teal: #0ca678;--tblr-cyan: #17a2b8;--tblr-primary-rgb: 0, 133, 125;--tblr-secondary-rgb: 107, 114, 128;--tblr-success-rgb: 47, 179, 68;--tblr-info-rgb: 66, 153, 225;--tblr-warning-rgb: 245, 159, 0;--tblr-danger-rgb: 214, 57, 57;--tblr-light-rgb: 249, 250, 251;--tblr-dark-rgb: 31, 41, 55;--tblr-muted-rgb: 107, 114, 128;--tblr-blue-rgb: 6, 111, 209;--tblr-azure-rgb: 66, 153, 225;--tblr-indigo-rgb: 66, 99, 235;--tblr-purple-rgb: 174, 62, 201;--tblr-pink-rgb: 214, 51, 108;--tblr-red-rgb: 214, 57, 57;--tblr-orange-rgb: 247, 103, 7;--tblr-yellow-rgb: 245, 159, 0;--tblr-lime-rgb: 116, 184, 22;--tblr-green-rgb: 47, 179, 68;--tblr-teal-rgb: 12, 166, 120;--tblr-cyan-rgb: 23, 162, 184;--tblr-primary-text-emphasis: rgb(0, 53.2, 50);--tblr-secondary-text-emphasis: rgb(42.8, 45.6, 51.2);--tblr-success-text-emphasis: rgb(18.8, 71.6, 27.2);--tblr-info-text-emphasis: rgb(26.4, 61.2, 90);--tblr-warning-text-emphasis: rgb(98, 63.6, 0);--tblr-danger-text-emphasis: rgb(85.6, 22.8, 22.8);--tblr-light-text-emphasis: #374151;--tblr-dark-text-emphasis: #374151;--tblr-primary-bg-subtle: rgb(204, 230.6, 229);--tblr-secondary-bg-subtle: rgb(225.4, 226.8, 229.6);--tblr-success-bg-subtle: rgb(213.4, 239.8, 217.6);--tblr-info-bg-subtle: rgb(217.2, 234.6, 249);--tblr-warning-bg-subtle: rgb(253, 235.8, 204);--tblr-danger-bg-subtle: rgb(246.8, 215.4, 215.4);--tblr-light-bg-subtle: rgb(249, 249.5, 250.5);--tblr-dark-bg-subtle: #9ca3af;--tblr-primary-border-subtle: rgb(153, 206.2, 203);--tblr-secondary-border-subtle: rgb(195.8, 198.6, 204.2);--tblr-success-border-subtle: rgb(171.8, 224.6, 180.2);--tblr-info-border-subtle: rgb(179.4, 214.2, 243);--tblr-warning-border-subtle: rgb(251, 216.6, 153);--tblr-danger-border-subtle: rgb(238.6, 175.8, 175.8);--tblr-light-border-subtle: #e5e7eb;--tblr-dark-border-subtle: #6b7280;--tblr-white-rgb: 255, 255, 255;--tblr-black-rgb: 0, 0, 0;--tblr-font-sans-serif: "Inter", system-ui, sans-serif;--tblr-font-monospace: "Roboto Mono";--tblr-gradient: linear-gradient(180deg, rgba(255, 255, 255, .15), rgba(255, 255, 255, 0));--tblr-body-font-family: var(--tblr-font-sans-serif);--tblr-body-font-size: .875rem;--tblr-body-font-weight: 400;--tblr-body-line-height: 1.4285714286;--tblr-body-color: #1f2937;--tblr-body-color-rgb: 31, 41, 55;--tblr-body-bg: #f9fafb;--tblr-body-bg-rgb: 249, 250, 251;--tblr-emphasis-color: #374151;--tblr-emphasis-color-rgb: 55, 65, 81;--tblr-secondary-color: rgba(31, 41, 55, .75);--tblr-secondary-color-rgb: 31, 41, 55;--tblr-secondary-bg: #e5e7eb;--tblr-secondary-bg-rgb: 229, 231, 235;--tblr-tertiary-color: rgba(31, 41, 55, .5);--tblr-tertiary-color-rgb: 31, 41, 55;--tblr-tertiary-bg: #f3f4f6;--tblr-tertiary-bg-rgb: 243, 244, 246;--tblr-heading-color: inherit;--tblr-link-color: #00857D;--tblr-link-color-rgb: 0, 133, 125;--tblr-link-decoration: none;--tblr-link-hover-color: rgb(0, 106.4, 100);--tblr-link-hover-color-rgb: 0, 106, 100;--tblr-link-hover-decoration: underline;--tblr-code-color: light-dark(var(--tblr-gray-600), var(--tblr-gray-400));--tblr-highlight-color: #1f2937;--tblr-highlight-bg: rgb(253, 235.8, 204);--tblr-border-width: 1px;--tblr-border-style: solid;--tblr-border-color: #e5e7eb;--tblr-border-color-translucent: rgba(4, 32, 69, .1);--tblr-border-radius: 6px;--tblr-border-radius-sm: 4px;--tblr-border-radius-lg: 8px;--tblr-border-radius-xl: 1rem;--tblr-border-radius-xxl: 2rem;--tblr-border-radius-2xl: var(--tblr-border-radius-xxl);--tblr-border-radius-pill: 100rem;--tblr-box-shadow: rgba(var(--tblr-body-color-rgb), .04) 0 2px 4px 0;--tblr-box-shadow-sm: 0 .125rem .25rem rgba(0, 0, 0, .075);--tblr-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, .175);--tblr-box-shadow-inset: 0 0 transparent;--tblr-focus-ring-width: .25rem;--tblr-focus-ring-opacity: .25;--tblr-focus-ring-color: rgba(var(--tblr-primary-rgb), .25);--tblr-form-valid-color: #2fb344;--tblr-form-valid-border-color: #2fb344;--tblr-form-invalid-color: #d63939;--tblr-form-invalid-border-color: #d63939}[data-bs-theme=dark],body[data-bs-theme=dark] [data-bs-theme=light]{color-scheme:dark;--tblr-body-color: #e5e7eb;--tblr-body-color-rgb: 229, 231, 235;--tblr-body-bg: #111827;--tblr-body-bg-rgb: 17, 24, 39;--tblr-emphasis-color: #ffffff;--tblr-emphasis-color-rgb: 255, 255, 255;--tblr-secondary-color: rgba(229, 231, 235, .75);--tblr-secondary-color-rgb: 229, 231, 235;--tblr-secondary-bg: #1f2937;--tblr-secondary-bg-rgb: 31, 41, 55;--tblr-tertiary-color: rgba(229, 231, 235, .5);--tblr-tertiary-color-rgb: 229, 231, 235;--tblr-tertiary-bg: rgb(24, 32.5, 47);--tblr-tertiary-bg-rgb: 24, 33, 47;--tblr-primary-text-emphasis: rgb(102, 181.8, 177);--tblr-secondary-text-emphasis: rgb(166.2, 170.4, 178.8);--tblr-success-text-emphasis: rgb(130.2, 209.4, 142.8);--tblr-info-text-emphasis: rgb(141.6, 193.8, 237);--tblr-warning-text-emphasis: rgb(249, 197.4, 102);--tblr-danger-text-emphasis: rgb(230.4, 136.2, 136.2);--tblr-light-text-emphasis: #f3f4f6;--tblr-dark-text-emphasis: #d1d5db;--tblr-primary-bg-subtle: rgb(0, 26.6, 25);--tblr-secondary-bg-subtle: rgb(21.4, 22.8, 25.6);--tblr-success-bg-subtle: rgb(9.4, 35.8, 13.6);--tblr-info-bg-subtle: rgb(13.2, 30.6, 45);--tblr-warning-bg-subtle: rgb(49, 31.8, 0);--tblr-danger-bg-subtle: rgb(42.8, 11.4, 11.4);--tblr-light-bg-subtle: #1f2937;--tblr-dark-bg-subtle: rgb(15.5, 20.5, 27.5);--tblr-primary-border-subtle: rgb(0, 79.8, 75);--tblr-secondary-border-subtle: rgb(64.2, 68.4, 76.8);--tblr-success-border-subtle: rgb(28.2, 107.4, 40.8);--tblr-info-border-subtle: rgb(39.6, 91.8, 135);--tblr-warning-border-subtle: rgb(147, 95.4, 0);--tblr-danger-border-subtle: rgb(128.4, 34.2, 34.2);--tblr-light-border-subtle: #374151;--tblr-dark-border-subtle: #1f2937;--tblr-heading-color: inherit;--tblr-link-color: rgb(102, 181.8, 177);--tblr-link-hover-color: rgb(132.6, 196.44, 192.6);--tblr-link-color-rgb: 102, 182, 177;--tblr-link-hover-color-rgb: 133, 196, 193;--tblr-code-color: var(--tblr-gray-300);--tblr-highlight-color: #e5e7eb;--tblr-highlight-bg: rgb(98, 63.6, 0);--tblr-border-color: rgb(45.7069767442, 60.4511627907, 81.0930232558);--tblr-border-color-translucent: rgba(72, 110, 149, .14);--tblr-form-valid-color: rgb(130.2, 209.4, 142.8);--tblr-form-valid-border-color: rgb(130.2, 209.4, 142.8);--tblr-form-invalid-color: rgb(230.4, 136.2, 136.2);--tblr-form-invalid-border-color: rgb(230.4, 136.2, 136.2)}*,*:before,*:after{box-sizing:border-box}@media(prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--tblr-body-font-family);font-size:var(--tblr-body-font-size);font-weight:var(--tblr-body-font-weight);line-height:var(--tblr-body-line-height);color:var(--tblr-body-color);text-align:var(--tblr-body-text-align);background-color:var(--tblr-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr,.hr{margin:2rem 0;color:inherit;border:0;border-top:var(--tblr-border-width) solid;opacity:.16}h6,.h6,h5,.h5,h4,.h4,h3,.field-group h2,.field-group .h2,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:var(--tblr-spacer);font-weight:var(--tblr-font-weight-bold);line-height:1.2;color:var(--tblr-heading-color)}h1,.h1{font-size:1.5rem}h2,.h2{font-size:1.25rem}h3,.field-group h2,.field-group .h2,.h3{font-size:1rem}h4,.h4{font-size:.875rem}h5,.h5{font-size:.75rem}h6,.h6{font-size:.625rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:600}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small,.small{font-size:.875em}mark,.mark{padding:.1875em;color:var(--tblr-highlight-color);background-color:var(--tblr-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:rgba(var(--tblr-link-color-rgb),var(--tblr-link-opacity, 1));text-decoration:none}a:hover{--tblr-link-color-rgb: var(--tblr-link-hover-color-rgb);text-decoration:underline}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:var(--tblr-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.85714285em;color:var(--tblr-light)}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.85714285em;color:var(--tblr-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.25rem .5rem;font-size:var(--tblr-font-size-h5);color:var(--tblr-text-secondary-dark);background-color:var(--tblr-code-bg);border-radius:4px}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:var(--tblr-secondary-color);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;line-height:inherit;font-size:1.5rem}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button{cursor:pointer;filter:grayscale(1)}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:.875rem;font-weight:var(--tblr-font-weight-normal)}.display-1{font-weight:300;line-height:1.2;font-size:5rem}.display-2{font-weight:300;line-height:1.2;font-size:4.5rem}.display-3{font-weight:300;line-height:1.2;font-size:4rem}.display-4{font-weight:300;line-height:1.2;font-size:3.5rem}.display-5{font-weight:300;line-height:1.2;font-size:3rem}.display-6{font-weight:300;line-height:1.2;font-size:2rem}.list-unstyled,.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:.875rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#4b5563}.blockquote-footer:before{content:"\2014\a0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:var(--tblr-body-bg);border:var(--tblr-border-width) solid var(--tblr-border-color);border-radius:var(--tblr-border-radius);box-shadow:var(--tblr-box-shadow-sm);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:var(--tblr-secondary-color)}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--tblr-gutter-x: calc(var(--tblr-page-padding) * 2);--tblr-gutter-y: 0;width:100%;padding-right:calc(var(--tblr-gutter-x) * .5);padding-left:calc(var(--tblr-gutter-x) * .5);margin-right:auto;margin-left:auto}@media(min-width:576px){.container-sm,.container{max-width:540px}}@media(min-width:768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width:992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width:1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media(min-width:1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}:root{--tblr-breakpoint-xs: 0;--tblr-breakpoint-sm: 576px;--tblr-breakpoint-md: 768px;--tblr-breakpoint-lg: 992px;--tblr-breakpoint-xl: 1200px;--tblr-breakpoint-xxl: 1400px}.row{--tblr-gutter-x: var(--tblr-page-padding);--tblr-gutter-y: 0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--tblr-gutter-y));margin-right:calc(-.5 * var(--tblr-gutter-x));margin-left:calc(-.5 * var(--tblr-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--tblr-gutter-x) * .5);padding-left:calc(var(--tblr-gutter-x) * .5);margin-top:var(--tblr-gutter-y)}.grid{display:grid;grid-template-rows:repeat(var(--tblr-rows, 1),1fr);grid-template-columns:repeat(var(--tblr-columns, 12),1fr);gap:var(--tblr-gap, var(--tblr-page-padding))}.grid .g-col-1{grid-column:auto/span 1}.grid .g-col-2{grid-column:auto/span 2}.grid .g-col-3{grid-column:auto/span 3}.grid .g-col-4{grid-column:auto/span 4}.grid .g-col-5{grid-column:auto/span 5}.grid .g-col-6{grid-column:auto/span 6}.grid .g-col-7{grid-column:auto/span 7}.grid .g-col-8{grid-column:auto/span 8}.grid .g-col-9{grid-column:auto/span 9}.grid .g-col-10{grid-column:auto/span 10}.grid .g-col-11{grid-column:auto/span 11}.grid .g-col-12{grid-column:auto/span 12}.grid .g-start-1{grid-column-start:1}.grid .g-start-2{grid-column-start:2}.grid .g-start-3{grid-column-start:3}.grid .g-start-4{grid-column-start:4}.grid .g-start-5{grid-column-start:5}.grid .g-start-6{grid-column-start:6}.grid .g-start-7{grid-column-start:7}.grid .g-start-8{grid-column-start:8}.grid .g-start-9{grid-column-start:9}.grid .g-start-10{grid-column-start:10}.grid .g-start-11{grid-column-start:11}@media(min-width:576px){.grid .g-col-sm-1{grid-column:auto/span 1}.grid .g-col-sm-2{grid-column:auto/span 2}.grid .g-col-sm-3{grid-column:auto/span 3}.grid .g-col-sm-4{grid-column:auto/span 4}.grid .g-col-sm-5{grid-column:auto/span 5}.grid .g-col-sm-6{grid-column:auto/span 6}.grid .g-col-sm-7{grid-column:auto/span 7}.grid .g-col-sm-8{grid-column:auto/span 8}.grid .g-col-sm-9{grid-column:auto/span 9}.grid .g-col-sm-10{grid-column:auto/span 10}.grid .g-col-sm-11{grid-column:auto/span 11}.grid .g-col-sm-12{grid-column:auto/span 12}.grid .g-start-sm-1{grid-column-start:1}.grid .g-start-sm-2{grid-column-start:2}.grid .g-start-sm-3{grid-column-start:3}.grid .g-start-sm-4{grid-column-start:4}.grid .g-start-sm-5{grid-column-start:5}.grid .g-start-sm-6{grid-column-start:6}.grid .g-start-sm-7{grid-column-start:7}.grid .g-start-sm-8{grid-column-start:8}.grid .g-start-sm-9{grid-column-start:9}.grid .g-start-sm-10{grid-column-start:10}.grid .g-start-sm-11{grid-column-start:11}}@media(min-width:768px){.grid .g-col-md-1{grid-column:auto/span 1}.grid .g-col-md-2{grid-column:auto/span 2}.grid .g-col-md-3{grid-column:auto/span 3}.grid .g-col-md-4{grid-column:auto/span 4}.grid .g-col-md-5{grid-column:auto/span 5}.grid .g-col-md-6{grid-column:auto/span 6}.grid .g-col-md-7{grid-column:auto/span 7}.grid .g-col-md-8{grid-column:auto/span 8}.grid .g-col-md-9{grid-column:auto/span 9}.grid .g-col-md-10{grid-column:auto/span 10}.grid .g-col-md-11{grid-column:auto/span 11}.grid .g-col-md-12{grid-column:auto/span 12}.grid .g-start-md-1{grid-column-start:1}.grid .g-start-md-2{grid-column-start:2}.grid .g-start-md-3{grid-column-start:3}.grid .g-start-md-4{grid-column-start:4}.grid .g-start-md-5{grid-column-start:5}.grid .g-start-md-6{grid-column-start:6}.grid .g-start-md-7{grid-column-start:7}.grid .g-start-md-8{grid-column-start:8}.grid .g-start-md-9{grid-column-start:9}.grid .g-start-md-10{grid-column-start:10}.grid .g-start-md-11{grid-column-start:11}}@media(min-width:992px){.grid .g-col-lg-1{grid-column:auto/span 1}.grid .g-col-lg-2{grid-column:auto/span 2}.grid .g-col-lg-3{grid-column:auto/span 3}.grid .g-col-lg-4{grid-column:auto/span 4}.grid .g-col-lg-5{grid-column:auto/span 5}.grid .g-col-lg-6{grid-column:auto/span 6}.grid .g-col-lg-7{grid-column:auto/span 7}.grid .g-col-lg-8{grid-column:auto/span 8}.grid .g-col-lg-9{grid-column:auto/span 9}.grid .g-col-lg-10{grid-column:auto/span 10}.grid .g-col-lg-11{grid-column:auto/span 11}.grid .g-col-lg-12{grid-column:auto/span 12}.grid .g-start-lg-1{grid-column-start:1}.grid .g-start-lg-2{grid-column-start:2}.grid .g-start-lg-3{grid-column-start:3}.grid .g-start-lg-4{grid-column-start:4}.grid .g-start-lg-5{grid-column-start:5}.grid .g-start-lg-6{grid-column-start:6}.grid .g-start-lg-7{grid-column-start:7}.grid .g-start-lg-8{grid-column-start:8}.grid .g-start-lg-9{grid-column-start:9}.grid .g-start-lg-10{grid-column-start:10}.grid .g-start-lg-11{grid-column-start:11}}@media(min-width:1200px){.grid .g-col-xl-1{grid-column:auto/span 1}.grid .g-col-xl-2{grid-column:auto/span 2}.grid .g-col-xl-3{grid-column:auto/span 3}.grid .g-col-xl-4{grid-column:auto/span 4}.grid .g-col-xl-5{grid-column:auto/span 5}.grid .g-col-xl-6{grid-column:auto/span 6}.grid .g-col-xl-7{grid-column:auto/span 7}.grid .g-col-xl-8{grid-column:auto/span 8}.grid .g-col-xl-9{grid-column:auto/span 9}.grid .g-col-xl-10{grid-column:auto/span 10}.grid .g-col-xl-11{grid-column:auto/span 11}.grid .g-col-xl-12{grid-column:auto/span 12}.grid .g-start-xl-1{grid-column-start:1}.grid .g-start-xl-2{grid-column-start:2}.grid .g-start-xl-3{grid-column-start:3}.grid .g-start-xl-4{grid-column-start:4}.grid .g-start-xl-5{grid-column-start:5}.grid .g-start-xl-6{grid-column-start:6}.grid .g-start-xl-7{grid-column-start:7}.grid .g-start-xl-8{grid-column-start:8}.grid .g-start-xl-9{grid-column-start:9}.grid .g-start-xl-10{grid-column-start:10}.grid .g-start-xl-11{grid-column-start:11}}@media(min-width:1400px){.grid .g-col-xxl-1{grid-column:auto/span 1}.grid .g-col-xxl-2{grid-column:auto/span 2}.grid .g-col-xxl-3{grid-column:auto/span 3}.grid .g-col-xxl-4{grid-column:auto/span 4}.grid .g-col-xxl-5{grid-column:auto/span 5}.grid .g-col-xxl-6{grid-column:auto/span 6}.grid .g-col-xxl-7{grid-column:auto/span 7}.grid .g-col-xxl-8{grid-column:auto/span 8}.grid .g-col-xxl-9{grid-column:auto/span 9}.grid .g-col-xxl-10{grid-column:auto/span 10}.grid .g-col-xxl-11{grid-column:auto/span 11}.grid .g-col-xxl-12{grid-column:auto/span 12}.grid .g-start-xxl-1{grid-column-start:1}.grid .g-start-xxl-2{grid-column-start:2}.grid .g-start-xxl-3{grid-column-start:3}.grid .g-start-xxl-4{grid-column-start:4}.grid .g-start-xxl-5{grid-column-start:5}.grid .g-start-xxl-6{grid-column-start:6}.grid .g-start-xxl-7{grid-column-start:7}.grid .g-start-xxl-8{grid-column-start:8}.grid .g-start-xxl-9{grid-column-start:9}.grid .g-start-xxl-10{grid-column-start:10}.grid .g-start-xxl-11{grid-column-start:11}}.col{flex:1 0 0}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.66666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--tblr-gutter-x: 0}.g-0,.gy-0{--tblr-gutter-y: 0}.g-1,.gx-1{--tblr-gutter-x: .25rem}.g-1,.gy-1{--tblr-gutter-y: .25rem}.g-2,.gx-2{--tblr-gutter-x: .5rem}.g-2,.gy-2{--tblr-gutter-y: .5rem}.g-3,.gx-3{--tblr-gutter-x: 1rem}.g-3,.gy-3{--tblr-gutter-y: 1rem}.g-4,.gx-4{--tblr-gutter-x: 1.5rem}.g-4,.gy-4{--tblr-gutter-y: 1.5rem}.g-5,.gx-5{--tblr-gutter-x: 2rem}.g-5,.gy-5{--tblr-gutter-y: 2rem}.g-6,.gx-6{--tblr-gutter-x: 2.5rem}.g-6,.gy-6{--tblr-gutter-y: 2.5rem}@media(min-width:576px){.col-sm{flex:1 0 0}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.66666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--tblr-gutter-x: 0}.g-sm-0,.gy-sm-0{--tblr-gutter-y: 0}.g-sm-1,.gx-sm-1{--tblr-gutter-x: .25rem}.g-sm-1,.gy-sm-1{--tblr-gutter-y: .25rem}.g-sm-2,.gx-sm-2{--tblr-gutter-x: .5rem}.g-sm-2,.gy-sm-2{--tblr-gutter-y: .5rem}.g-sm-3,.gx-sm-3{--tblr-gutter-x: 1rem}.g-sm-3,.gy-sm-3{--tblr-gutter-y: 1rem}.g-sm-4,.gx-sm-4{--tblr-gutter-x: 1.5rem}.g-sm-4,.gy-sm-4{--tblr-gutter-y: 1.5rem}.g-sm-5,.gx-sm-5{--tblr-gutter-x: 2rem}.g-sm-5,.gy-sm-5{--tblr-gutter-y: 2rem}.g-sm-6,.gx-sm-6{--tblr-gutter-x: 2.5rem}.g-sm-6,.gy-sm-6{--tblr-gutter-y: 2.5rem}}@media(min-width:768px){.col-md{flex:1 0 0}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.66666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--tblr-gutter-x: 0}.g-md-0,.gy-md-0{--tblr-gutter-y: 0}.g-md-1,.gx-md-1{--tblr-gutter-x: .25rem}.g-md-1,.gy-md-1{--tblr-gutter-y: .25rem}.g-md-2,.gx-md-2{--tblr-gutter-x: .5rem}.g-md-2,.gy-md-2{--tblr-gutter-y: .5rem}.g-md-3,.gx-md-3{--tblr-gutter-x: 1rem}.g-md-3,.gy-md-3{--tblr-gutter-y: 1rem}.g-md-4,.gx-md-4{--tblr-gutter-x: 1.5rem}.g-md-4,.gy-md-4{--tblr-gutter-y: 1.5rem}.g-md-5,.gx-md-5{--tblr-gutter-x: 2rem}.g-md-5,.gy-md-5{--tblr-gutter-y: 2rem}.g-md-6,.gx-md-6{--tblr-gutter-x: 2.5rem}.g-md-6,.gy-md-6{--tblr-gutter-y: 2.5rem}}@media(min-width:992px){.col-lg{flex:1 0 0}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.66666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--tblr-gutter-x: 0}.g-lg-0,.gy-lg-0{--tblr-gutter-y: 0}.g-lg-1,.gx-lg-1{--tblr-gutter-x: .25rem}.g-lg-1,.gy-lg-1{--tblr-gutter-y: .25rem}.g-lg-2,.gx-lg-2{--tblr-gutter-x: .5rem}.g-lg-2,.gy-lg-2{--tblr-gutter-y: .5rem}.g-lg-3,.gx-lg-3{--tblr-gutter-x: 1rem}.g-lg-3,.gy-lg-3{--tblr-gutter-y: 1rem}.g-lg-4,.gx-lg-4{--tblr-gutter-x: 1.5rem}.g-lg-4,.gy-lg-4{--tblr-gutter-y: 1.5rem}.g-lg-5,.gx-lg-5{--tblr-gutter-x: 2rem}.g-lg-5,.gy-lg-5{--tblr-gutter-y: 2rem}.g-lg-6,.gx-lg-6{--tblr-gutter-x: 2.5rem}.g-lg-6,.gy-lg-6{--tblr-gutter-y: 2.5rem}}@media(min-width:1200px){.col-xl{flex:1 0 0}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.66666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--tblr-gutter-x: 0}.g-xl-0,.gy-xl-0{--tblr-gutter-y: 0}.g-xl-1,.gx-xl-1{--tblr-gutter-x: .25rem}.g-xl-1,.gy-xl-1{--tblr-gutter-y: .25rem}.g-xl-2,.gx-xl-2{--tblr-gutter-x: .5rem}.g-xl-2,.gy-xl-2{--tblr-gutter-y: .5rem}.g-xl-3,.gx-xl-3{--tblr-gutter-x: 1rem}.g-xl-3,.gy-xl-3{--tblr-gutter-y: 1rem}.g-xl-4,.gx-xl-4{--tblr-gutter-x: 1.5rem}.g-xl-4,.gy-xl-4{--tblr-gutter-y: 1.5rem}.g-xl-5,.gx-xl-5{--tblr-gutter-x: 2rem}.g-xl-5,.gy-xl-5{--tblr-gutter-y: 2rem}.g-xl-6,.gx-xl-6{--tblr-gutter-x: 2.5rem}.g-xl-6,.gy-xl-6{--tblr-gutter-y: 2.5rem}}@media(min-width:1400px){.col-xxl{flex:1 0 0}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.66666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--tblr-gutter-x: 0}.g-xxl-0,.gy-xxl-0{--tblr-gutter-y: 0}.g-xxl-1,.gx-xxl-1{--tblr-gutter-x: .25rem}.g-xxl-1,.gy-xxl-1{--tblr-gutter-y: .25rem}.g-xxl-2,.gx-xxl-2{--tblr-gutter-x: .5rem}.g-xxl-2,.gy-xxl-2{--tblr-gutter-y: .5rem}.g-xxl-3,.gx-xxl-3{--tblr-gutter-x: 1rem}.g-xxl-3,.gy-xxl-3{--tblr-gutter-y: 1rem}.g-xxl-4,.gx-xxl-4{--tblr-gutter-x: 1.5rem}.g-xxl-4,.gy-xxl-4{--tblr-gutter-y: 1.5rem}.g-xxl-5,.gx-xxl-5{--tblr-gutter-x: 2rem}.g-xxl-5,.gy-xxl-5{--tblr-gutter-y: 2rem}.g-xxl-6,.gx-xxl-6{--tblr-gutter-x: 2.5rem}.g-xxl-6,.gy-xxl-6{--tblr-gutter-y: 2.5rem}}.table,.markdown>table{--tblr-table-color-type: initial;--tblr-table-bg-type: initial;--tblr-table-color-state: initial;--tblr-table-bg-state: initial;--tblr-table-color: inherit;--tblr-table-bg: transparent;--tblr-table-border-color: var(--tblr-border-color-translucent);--tblr-table-accent-bg: transparent;--tblr-table-striped-color: inherit;--tblr-table-striped-bg: var(--tblr-bg-surface-tertiary);--tblr-table-active-color: inherit;--tblr-table-active-bg: var(--tblr-active-bg);--tblr-table-hover-color: inherit;--tblr-table-hover-bg: rgba(var(--tblr-emphasis-color-rgb), .075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--tblr-table-border-color)}.table>:not(caption)>*>*,.markdown>table>:not(caption)>*>*{padding:.5rem;color:var(--tblr-table-color-state, var(--tblr-table-color-type, var(--tblr-table-color)));background-color:var(--tblr-table-bg);border-bottom-width:var(--tblr-border-width);box-shadow:inset 0 0 0 9999px var(--tblr-table-bg-state, var(--tblr-table-bg-type, var(--tblr-table-accent-bg)))}.table>tbody,.markdown>table>tbody{vertical-align:inherit}.table>thead,.markdown>table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(var(--tblr-border-width) * 2) solid var(--tblr-border-color-translucent)}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*,.markdown>table>:not(caption)>*>*{padding:.25rem}.table-bordered>:not(caption)>*,.markdown>table>:not(caption)>*{border-width:var(--tblr-border-width) 0}.table-bordered>:not(caption)>*>*,.markdown>table>:not(caption)>*>*{border-width:0 var(--tblr-border-width)}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(2n)>*{--tblr-table-color-type: var(--tblr-table-striped-color);--tblr-table-bg-type: var(--tblr-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(2n){--tblr-table-color-type: var(--tblr-table-striped-color);--tblr-table-bg-type: var(--tblr-table-striped-bg)}.table-active{--tblr-table-color-state: var(--tblr-table-active-color);--tblr-table-bg-state: var(--tblr-table-active-bg)}.table-hover>tbody>tr:hover>*{--tblr-table-color-state: var(--tblr-table-hover-color);--tblr-table-bg-state: var(--tblr-table-hover-bg)}.table-primary{--tblr-table-color: #1f2937;--tblr-table-bg: rgb(204, 230.6, 229);--tblr-table-border-color: rgb(169.4, 192.68, 194.2);--tblr-table-striped-bg: rgb(195.35, 221.12, 220.3);--tblr-table-striped-color: #1f2937;--tblr-table-active-bg: rgb(186.7, 211.64, 211.6);--tblr-table-active-color: #1f2937;--tblr-table-hover-bg: rgb(191.025, 216.38, 215.95);--tblr-table-hover-color: #1f2937;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-secondary{--tblr-table-color: #1f2937;--tblr-table-bg: rgb(225.4, 226.8, 229.6);--tblr-table-border-color: rgb(186.52, 189.64, 194.68);--tblr-table-striped-bg: rgb(215.68, 217.51, 220.87);--tblr-table-striped-color: #1f2937;--tblr-table-active-bg: rgb(205.96, 208.22, 212.14);--tblr-table-active-color: #1f2937;--tblr-table-hover-bg: rgb(210.82, 212.865, 216.505);--tblr-table-hover-color: #1f2937;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-success{--tblr-table-color: #1f2937;--tblr-table-bg: rgb(213.4, 239.8, 217.6);--tblr-table-border-color: rgb(176.92, 200.04, 185.08);--tblr-table-striped-bg: rgb(204.28, 229.86, 209.47);--tblr-table-striped-color: #1f2937;--tblr-table-active-bg: rgb(195.16, 219.92, 201.34);--tblr-table-active-color: #1f2937;--tblr-table-hover-bg: rgb(199.72, 224.89, 205.405);--tblr-table-hover-color: #1f2937;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-info{--tblr-table-color: #1f2937;--tblr-table-bg: rgb(217.2, 234.6, 249);--tblr-table-border-color: rgb(179.96, 195.88, 210.2);--tblr-table-striped-bg: rgb(207.89, 224.92, 239.3);--tblr-table-striped-color: #1f2937;--tblr-table-active-bg: rgb(198.58, 215.24, 229.6);--tblr-table-active-color: #1f2937;--tblr-table-hover-bg: rgb(203.235, 220.08, 234.45);--tblr-table-hover-color: #1f2937;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-warning{--tblr-table-color: #1f2937;--tblr-table-bg: rgb(253, 235.8, 204);--tblr-table-border-color: rgb(208.6, 196.84, 174.2);--tblr-table-striped-bg: rgb(241.9, 226.06, 196.55);--tblr-table-striped-color: #1f2937;--tblr-table-active-bg: rgb(230.8, 216.32, 189.1);--tblr-table-active-color: #1f2937;--tblr-table-hover-bg: rgb(236.35, 221.19, 192.825);--tblr-table-hover-color: #1f2937;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-danger{--tblr-table-color: #1f2937;--tblr-table-bg: rgb(246.8, 215.4, 215.4);--tblr-table-border-color: rgb(203.64, 180.52, 183.32);--tblr-table-striped-bg: rgb(236.01, 206.68, 207.38);--tblr-table-striped-color: #1f2937;--tblr-table-active-bg: rgb(225.22, 197.96, 199.36);--tblr-table-active-color: #f9fafb;--tblr-table-hover-bg: rgb(230.615, 202.32, 203.37);--tblr-table-hover-color: #1f2937;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-light{--tblr-table-color: #1f2937;--tblr-table-bg: #f9fafb;--tblr-table-border-color: rgb(205.4, 208.2, 211.8);--tblr-table-striped-bg: rgb(238.1, 239.55, 241.2);--tblr-table-striped-color: #1f2937;--tblr-table-active-bg: rgb(227.2, 229.1, 231.4);--tblr-table-active-color: #1f2937;--tblr-table-hover-bg: rgb(232.65, 234.325, 236.3);--tblr-table-hover-color: #1f2937;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-dark{--tblr-table-color: #f9fafb;--tblr-table-bg: #1f2937;--tblr-table-border-color: rgb(74.6, 82.8, 94.2);--tblr-table-striped-bg: rgb(41.9, 51.45, 64.8);--tblr-table-striped-color: #f9fafb;--tblr-table-active-bg: rgb(52.8, 61.9, 74.6);--tblr-table-active-color: #f9fafb;--tblr-table-hover-bg: rgb(47.35, 56.675, 69.7);--tblr-table-hover-color: #f9fafb;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media(max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem;font-size:.875rem;font-weight:var(--tblr-font-weight-medium)}.col-form-label{padding-top:calc(.5625rem + var(--tblr-border-width));padding-bottom:calc(.5625rem + var(--tblr-border-width));margin-bottom:0;font-size:inherit;font-weight:var(--tblr-font-weight-medium);line-height:1.25rem}.col-form-label-lg{padding-top:calc(.6875rem + var(--tblr-border-width));padding-bottom:calc(.6875rem + var(--tblr-border-width));font-size:1rem}.col-form-label-sm{padding-top:calc(.3125rem + var(--tblr-border-width));padding-bottom:calc(.3125rem + var(--tblr-border-width));font-size:.75rem}.form-text{margin-top:.25rem;font-size:.875em;color:var(--tblr-secondary-color)}.form-control{display:block;width:100%;padding:.5625rem 1rem;font-family:var(--tblr-body-font-family);font-size:.875rem;font-weight:400;line-height:1.25rem;color:var(--tblr-body-color);appearance:none;background-color:var(--tblr-bg-forms);background-clip:padding-box;border:var(--tblr-border-width) solid var(--tblr-border-color);border-radius:var(--tblr-border-radius);box-shadow:var(--tblr-shadow-input);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:var(--tblr-body-color);background-color:var(--tblr-bg-forms);border-color:#80c2be;outline:0;box-shadow:var(--tblr-shadow-input),0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.25rem;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::placeholder{color:var(--tblr-tertiary);opacity:1}.form-control:disabled{background-color:var(--tblr-bg-surface-secondary);opacity:1}.form-control::file-selector-button{padding:.5625rem 1rem;margin:-.5625rem -1rem;margin-inline-end:1rem;color:var(--tblr-body-color);background-color:var(--tblr-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--tblr-border-width);border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:var(--tblr-secondary-bg)}.form-control-plaintext{display:block;width:100%;padding:.5625rem 0;margin-bottom:0;line-height:1.25rem;color:var(--tblr-body-color);background-color:transparent;border:solid transparent;border-width:var(--tblr-border-width) 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.25rem + .625rem + calc(var(--tblr-border-width) * 2));padding:.3125rem .5rem;font-size:.75rem;border-radius:var(--tblr-border-radius-sm)}.form-control-sm::file-selector-button{padding:.3125rem .5rem;margin:-.3125rem -.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.25rem + 1.375rem + calc(var(--tblr-border-width) * 2));padding:.6875rem 1.5rem;font-size:1rem;border-radius:var(--tblr-border-radius-lg)}.form-control-lg::file-selector-button{padding:.6875rem 1.5rem;margin:-.6875rem -1.5rem;margin-inline-end:1.5rem}textarea.form-control{min-height:calc(1.25rem + 1.125rem + calc(var(--tblr-border-width) * 2))}textarea.form-control-sm{min-height:calc(1.25rem + .625rem + calc(var(--tblr-border-width) * 2))}textarea.form-control-lg{min-height:calc(1.25rem + 1.375rem + calc(var(--tblr-border-width) * 2))}.form-control-color{width:3rem;height:calc(1.25rem + 1.125rem + calc(var(--tblr-border-width) * 2));padding:.5625rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0!important;border-radius:var(--tblr-border-radius)}.form-control-color::-webkit-color-swatch{border:0!important;border-radius:var(--tblr-border-radius)}.form-control-color.form-control-sm{height:calc(1.25rem + .625rem + calc(var(--tblr-border-width) * 2))}.form-control-color.form-control-lg{height:calc(1.25rem + 1.375rem + calc(var(--tblr-border-width) * 2))}.form-select{--tblr-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%239ca3af' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.5625rem 3rem .5625rem 1rem;font-family:var(--tblr-body-font-family);font-size:.875rem;font-weight:400;line-height:1.25rem;color:var(--tblr-body-color);appearance:none;background-color:var(--tblr-bg-forms);background-image:var(--tblr-form-select-bg-img),var(--tblr-form-select-bg-icon, none);background-repeat:no-repeat;background-position:right 1rem center;background-size:16px 12px;border:var(--tblr-border-width) solid var(--tblr-border-color);border-radius:var(--tblr-border-radius);box-shadow:var(--tblr-shadow-input);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#80c2be;outline:0;box-shadow:var(--tblr-shadow-input),0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:1rem;background-image:none}.form-select:disabled{background-color:var(--tblr-bg-surface-secondary)}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 var(--tblr-body-color)}.form-select-sm{padding-top:.3125rem;padding-bottom:.3125rem;padding-left:.5rem;font-size:.75rem;border-radius:var(--tblr-border-radius-sm)}.form-select-lg{padding-top:.6875rem;padding-bottom:.6875rem;padding-left:1.5rem;font-size:1rem;border-radius:var(--tblr-border-radius-lg)}[data-bs-theme=dark] .form-select,body[data-bs-theme=dark] [data-bs-theme=light] .form-select{--tblr-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23e5e7eb' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check{display:block;min-height:1.25rem;padding-left:2rem;margin-bottom:.75rem}.form-check .form-check-input{float:left;margin-left:-2rem}.form-check-reverse{padding-right:2rem;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:-2rem;margin-left:0}.form-check-input{--tblr-form-check-bg: var(--tblr-bg-forms);flex-shrink:0;width:1.25rem;height:1.25rem;margin-top:.0892857143rem;vertical-align:top;appearance:none;background-color:var(--tblr-form-check-bg);background-image:var(--tblr-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent);print-color-adjust:exact}.form-check-input[type=checkbox]{border-radius:var(--tblr-border-radius)}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#80c2be;outline:0;box-shadow:0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.form-check-input:checked{background-color:var(--tblr-primary);border-color:var(--tblr-border-color-translucent)}.form-check-input:checked[type=checkbox]{--tblr-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' width='16' height='16'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8.5l2.5 2.5l5.5 -5.5'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{--tblr-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3ccircle r='3' fill='%23ffffff' cx='8' cy='8' /%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:var(--tblr-primary);border-color:var(--tblr-primary);--tblr-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input:disabled~.form-check-label{cursor:default;opacity:.7}.form-switch{padding-left:2.5rem}.form-switch .form-check-input{--tblr-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23e5e7eb'/%3e%3c/svg%3e");width:2rem;margin-left:-2.5rem;background-image:var(--tblr-form-switch-bg);background-position:left center;border-radius:2rem;transition:background-position .15s ease-in-out}.form-switch .form-check-input:focus{--tblr-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgb%28127.5, 194, 190%29'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--tblr-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23ffffff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5rem;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5rem;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.4}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--tblr-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.25rem;padding:0;appearance:none;background-color:transparent}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #f9fafb,0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #f9fafb,0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.375rem;appearance:none;background-color:var(--tblr-primary);border:2px var(--tblr-border-style) #ffffff;border-radius:1rem;box-shadow:0 .1rem .25rem #0000001a;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b3dad8}.form-range::-webkit-slider-runnable-track{width:100%;height:.25rem;color:transparent;cursor:pointer;background-color:var(--tblr-border-color);border-color:transparent;border-radius:1rem;box-shadow:var(--tblr-box-shadow-inset)}.form-range::-moz-range-thumb{width:1rem;height:1rem;appearance:none;background-color:var(--tblr-primary);border:2px var(--tblr-border-style) #ffffff;border-radius:1rem;box-shadow:0 .1rem .25rem #0000001a;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#b3dad8}.form-range::-moz-range-track{width:100%;height:.25rem;color:transparent;cursor:pointer;background-color:var(--tblr-border-color);border-color:transparent;border-radius:1rem;box-shadow:var(--tblr-box-shadow-inset)}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:var(--tblr-secondary-color)}.form-range:disabled::-moz-range-thumb{background-color:var(--tblr-secondary-color)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(var(--tblr-border-width) * 2));min-height:calc(3.5rem + calc(var(--tblr-border-width) * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;max-width:100%;height:100%;padding:1rem;overflow:hidden;color:rgba(var(--tblr-body-color-rgb),.65);text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:var(--tblr-border-width) solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media(prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem}.form-floating>.form-control::placeholder,.form-floating>.form-control-plaintext::placeholder{color:transparent}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill,.form-floating>.form-control-plaintext:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem;padding-left:1rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-control-plaintext~label,.form-floating>.form-select~label{transform:scale(.85) translateY(-.5rem) translate(.15rem)}.form-floating>.form-control:-webkit-autofill~label{transform:scale(.85) translateY(-.5rem) translate(.15rem)}.form-floating>textarea:focus~label:after,.form-floating>textarea:not(:placeholder-shown)~label:after{position:absolute;inset:1rem .5rem;z-index:-1;height:1.5em;content:"";background-color:var(--tblr-bg-forms);border-radius:var(--tblr-border-radius)}.form-floating>textarea:disabled~label:after{background-color:var(--tblr-bg-surface-secondary)}.form-floating>.form-control-plaintext~label{border-width:var(--tblr-border-width) 0}.form-floating>:disabled~label,.form-floating>.form-control:disabled~label{color:#4b5563}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select,.input-group>.form-floating{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus,.input-group>.form-floating:focus-within{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;align-items:center;padding:.5625rem 1rem;font-size:.875rem;font-weight:400;line-height:1.25rem;color:var(--tblr-gray-500);text-align:center;white-space:nowrap;background-color:var(--tblr-bg-surface-secondary);border:var(--tblr-border-width) solid var(--tblr-border-color);border-radius:var(--tblr-border-radius)}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.6875rem 1.5rem;font-size:1rem;border-radius:var(--tblr-border-radius-lg)}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.3125rem .5rem;font-size:.75rem;border-radius:var(--tblr-border-radius-sm)}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:4rem}.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(-1 * var(--tblr-border-width));border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--tblr-form-valid-color)}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:var(--tblr-spacer-1) var(--tblr-spacer-3);margin-top:.1rem;font-size:.765625rem;color:#fff;background-color:var(--tblr-success);border-radius:var(--tblr-border-radius)}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:var(--tblr-form-valid-border-color);padding-right:2.375rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%232fb344' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='20 6 9 17 4 12'%3e%3c/polyline%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right 1.53125rem center;background-size:1.8125rem 1.8125rem}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:var(--tblr-form-valid-border-color);box-shadow:var(--tblr-shadow-input),0 0 0 .25rem rgba(var(--tblr-success-rgb),.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:2.375rem;background-position:top 1.53125rem right 1.53125rem}.was-validated .form-select:valid,.form-select.is-valid{border-color:var(--tblr-form-valid-border-color)}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{--tblr-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%232fb344' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='20 6 9 17 4 12'%3e%3c/polyline%3e%3c/svg%3e");padding-right:5.5rem;background-position:right 1rem center,center right 3rem;background-size:16px 12px,1.8125rem 1.8125rem}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:var(--tblr-form-valid-border-color);box-shadow:var(--tblr-shadow-input),0 0 0 .25rem rgba(var(--tblr-success-rgb),.25)}.was-validated .form-control-color:valid,.form-control-color.is-valid{width:5.375rem}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:var(--tblr-form-valid-border-color)}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:var(--tblr-form-valid-color)}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(var(--tblr-success-rgb),.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:var(--tblr-form-valid-color)}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):valid,.input-group>.form-control:not(:focus).is-valid,.was-validated .input-group>.form-select:not(:focus):valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.input-group>.form-floating:not(:focus-within).is-valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--tblr-form-invalid-color)}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:var(--tblr-spacer-1) var(--tblr-spacer-3);margin-top:.1rem;font-size:.765625rem;color:#fff;background-color:var(--tblr-danger);border-radius:var(--tblr-border-radius)}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,select.tomselected.is-invalid+div.ts-wrapper~.invalid-feedback,.is-invalid~.invalid-tooltip,select.tomselected.is-invalid+div.ts-wrapper~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid,select.tomselected.is-invalid+div.form-control.ts-wrapper{border-color:var(--tblr-form-invalid-border-color);padding-right:2.375rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23d63939' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cline x1='18' y1='6' x2='6' y2='18'%3e%3c/line%3e%3cline x1='6' y1='6' x2='18' y2='18'%3e%3c/line%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right 1.53125rem center;background-size:1.8125rem 1.8125rem}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus,select.tomselected.is-invalid+div.form-control.ts-wrapper:focus{border-color:var(--tblr-form-invalid-border-color);box-shadow:var(--tblr-shadow-input),0 0 0 .25rem rgba(var(--tblr-danger-rgb),.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:2.375rem;background-position:top 1.53125rem right 1.53125rem}.was-validated .form-select:invalid,.form-select.is-invalid,select.tomselected.is-invalid+div.form-select.ts-wrapper{border-color:var(--tblr-form-invalid-border-color)}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),select.tomselected.is-invalid+div.form-select.ts-wrapper:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],select.tomselected.is-invalid+div.form-select.ts-wrapper:not([multiple])[size="1"]{--tblr-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23d63939' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cline x1='18' y1='6' x2='6' y2='18'%3e%3c/line%3e%3cline x1='6' y1='6' x2='18' y2='18'%3e%3c/line%3e%3c/svg%3e");padding-right:5.5rem;background-position:right 1rem center,center right 3rem;background-size:16px 12px,1.8125rem 1.8125rem}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus,select.tomselected.is-invalid+div.form-select.ts-wrapper:focus{border-color:var(--tblr-form-invalid-border-color);box-shadow:var(--tblr-shadow-input),0 0 0 .25rem rgba(var(--tblr-danger-rgb),.25)}.was-validated .form-control-color:invalid,.form-control-color.is-invalid,select.tomselected.is-invalid+div.form-control-color.ts-wrapper{width:5.375rem}.was-validated .form-check-input:invalid,.form-check-input.is-invalid,select.tomselected.is-invalid+div.form-check-input.ts-wrapper{border-color:var(--tblr-form-invalid-border-color)}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked,select.tomselected.is-invalid+div.form-check-input.ts-wrapper:checked{background-color:var(--tblr-form-invalid-color)}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus,select.tomselected.is-invalid+div.form-check-input.ts-wrapper:focus{box-shadow:0 0 0 .25rem rgba(var(--tblr-danger-rgb),.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label,select.tomselected.is-invalid+div.form-check-input.ts-wrapper~.form-check-label{color:var(--tblr-form-invalid-color)}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):invalid,.input-group>.form-control:not(:focus).is-invalid,.input-group>select.tomselected.is-invalid+div.form-control.ts-wrapper:not(:focus),.was-validated .input-group>.form-select:not(:focus):invalid,.input-group>.form-select:not(:focus).is-invalid,.input-group>select.tomselected.is-invalid+div.form-select.ts-wrapper:not(:focus),.was-validated .input-group>.form-floating:not(:focus-within):invalid,.input-group>.form-floating:not(:focus-within).is-invalid,.input-group>select.tomselected.is-invalid+div.form-floating.ts-wrapper:not(:focus-within){z-index:4}.btn{--tblr-btn-padding-x: .5rem;--tblr-btn-padding-y: .25rem;--tblr-btn-font-family: var(--tblr-body-font-family);--tblr-btn-font-size: .875rem;--tblr-btn-font-weight: var(--tblr-font-weight-medium);--tblr-btn-line-height: 1.25rem;--tblr-btn-color: var(--tblr-body-color);--tblr-btn-bg: transparent;--tblr-btn-border-width: var(--tblr-border-width);--tblr-btn-border-color: transparent;--tblr-btn-border-radius: var(--tblr-border-radius);--tblr-btn-hover-border-color: transparent;--tblr-btn-box-shadow: var(--tblr-shadow-input);--tblr-btn-disabled-opacity: .4;--tblr-btn-focus-box-shadow: 0 0 0 .25rem rgba(var(--tblr-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--tblr-btn-padding-y) var(--tblr-btn-padding-x);font-family:var(--tblr-btn-font-family);font-size:var(--tblr-btn-font-size);font-weight:var(--tblr-btn-font-weight);line-height:var(--tblr-btn-line-height);color:var(--tblr-btn-color);text-align:center;vertical-align:middle;cursor:pointer;user-select:none;border:var(--tblr-btn-border-width) solid var(--tblr-btn-border-color);border-radius:var(--tblr-btn-border-radius);background-color:var(--tblr-btn-bg);box-shadow:var(--tblr-btn-box-shadow);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:var(--tblr-btn-hover-color);text-decoration:none;background-color:var(--tblr-btn-hover-bg);border-color:var(--tblr-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--tblr-btn-color);background-color:var(--tblr-btn-bg);border-color:var(--tblr-btn-border-color)}.btn:focus-visible{color:var(--tblr-btn-hover-color);background-color:var(--tblr-btn-hover-bg);border-color:var(--tblr-btn-hover-border-color);outline:0;box-shadow:var(--tblr-btn-box-shadow),var(--tblr-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--tblr-btn-hover-border-color);outline:0;box-shadow:var(--tblr-btn-box-shadow),var(--tblr-btn-focus-box-shadow)}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--tblr-btn-active-color);background-color:var(--tblr-btn-active-bg);border-color:var(--tblr-btn-active-border-color);box-shadow:var(--tblr-btn-active-shadow)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--tblr-btn-active-shadow),var(--tblr-btn-focus-box-shadow)}.btn-check:checked:focus-visible+.btn{box-shadow:var(--tblr-btn-active-shadow),var(--tblr-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--tblr-btn-disabled-color);pointer-events:none;background-color:var(--tblr-btn-disabled-bg);border-color:var(--tblr-btn-disabled-border-color);opacity:var(--tblr-btn-disabled-opacity);box-shadow:none}.btn-link{--tblr-btn-font-weight: 400;--tblr-btn-color: var(--tblr-link-color);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-link-hover-color);--tblr-btn-hover-border-color: transparent;--tblr-btn-active-color: var(--tblr-link-hover-color);--tblr-btn-active-border-color: transparent;--tblr-btn-disabled-color: #4b5563;--tblr-btn-disabled-border-color: transparent;--tblr-btn-box-shadow: 0 0 0 #000;--tblr-btn-focus-shadow-rgb: 37, 151, 144;text-decoration:none}.btn-link:hover,.btn-link:focus-visible{text-decoration:underline}.btn-link:focus-visible{color:var(--tblr-btn-color)}.btn-link:hover{color:var(--tblr-btn-hover-color)}.btn-lg,.btn-group-lg>.btn{--tblr-btn-padding-y: .6875rem;--tblr-btn-padding-x: 1.5rem;--tblr-btn-font-size: 1rem;--tblr-btn-border-radius: var(--tblr-border-radius-lg)}.btn-sm,.btn-group-sm>.btn{--tblr-btn-padding-y: .3125rem;--tblr-btn-padding-x: .5rem;--tblr-btn-font-size: .75rem;--tblr-btn-border-radius: var(--tblr-border-radius-sm)}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media(prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle:after{content:"";display:inline-block;vertical-align:.306em;width:.36em;height:.36em;border-bottom:1px var(--tblr-border-style);border-left:1px var(--tblr-border-style);margin-right:.1em;margin-left:.4em;transform:rotate(-45deg)}.dropdown-menu{--tblr-dropdown-zindex: 1000;--tblr-dropdown-min-width: 11rem;--tblr-dropdown-padding-x: 0;--tblr-dropdown-padding-y: .25rem;--tblr-dropdown-spacer: 1px;--tblr-dropdown-font-size: .875rem;--tblr-dropdown-color: var(--tblr-body-color);--tblr-dropdown-bg: var(--tblr-bg-surface);--tblr-dropdown-border-color: var(--tblr-border-color-translucent);--tblr-dropdown-border-radius: var(--tblr-border-radius);--tblr-dropdown-border-width: var(--tblr-border-width);--tblr-dropdown-inner-border-radius: calc(var(--tblr-border-radius) - var(--tblr-border-width));--tblr-dropdown-divider-bg: var(--tblr-border-color-translucent);--tblr-dropdown-divider-margin-y: var(--tblr-spacer-2);--tblr-dropdown-box-shadow: var(--tblr-shadow-dropdown);--tblr-dropdown-link-color: inherit;--tblr-dropdown-link-hover-color: inherit;--tblr-dropdown-link-hover-bg: rgba(var(--tblr-secondary-rgb), .08);--tblr-dropdown-link-active-color: var(--tblr-primary);--tblr-dropdown-link-active-bg: var(--tblr-active-bg);--tblr-dropdown-link-disabled-color: var(--tblr-tertiary-color);--tblr-dropdown-item-padding-x: .75rem;--tblr-dropdown-item-padding-y: .5rem;--tblr-dropdown-header-color: #4b5563;--tblr-dropdown-header-padding-x: .75rem;--tblr-dropdown-header-padding-y: .25rem;position:absolute;z-index:var(--tblr-dropdown-zindex);display:none;min-width:var(--tblr-dropdown-min-width);padding:var(--tblr-dropdown-padding-y) var(--tblr-dropdown-padding-x);margin:0;font-size:var(--tblr-dropdown-font-size);color:var(--tblr-dropdown-color);text-align:left;list-style:none;background-color:var(--tblr-dropdown-bg);background-clip:padding-box;border:var(--tblr-dropdown-border-width) solid var(--tblr-dropdown-border-color);border-radius:var(--tblr-dropdown-border-radius);box-shadow:var(--tblr-dropdown-box-shadow)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--tblr-dropdown-spacer)}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media(min-width:576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media(min-width:768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media(min-width:992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media(min-width:1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media(min-width:1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--tblr-dropdown-spacer)}.dropup .dropdown-toggle:after{content:"";display:inline-block;vertical-align:.306em;width:.36em;height:.36em;border-bottom:1px var(--tblr-border-style);border-left:1px var(--tblr-border-style);margin-right:.1em;margin-left:.4em;transform:rotate(135deg)}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--tblr-dropdown-spacer)}.dropend .dropdown-toggle:after{content:"";display:inline-block;vertical-align:.306em;width:.36em;height:.36em;border-bottom:1px var(--tblr-border-style);border-left:1px var(--tblr-border-style);margin-right:.1em;margin-left:.4em;transform:rotate(-135deg)}.dropend .dropdown-toggle:after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--tblr-dropdown-spacer)}.dropstart .dropdown-toggle:after{content:"";display:inline-block;vertical-align:.306em;width:.36em;height:.36em;border-bottom:1px var(--tblr-border-style);border-left:1px var(--tblr-border-style);margin-right:.1em;margin-left:.4em;transform:rotate(45deg)}.dropstart .dropdown-toggle:before{vertical-align:0}.dropdown-divider{height:0;margin:var(--tblr-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--tblr-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--tblr-dropdown-item-padding-y) var(--tblr-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--tblr-dropdown-link-color);text-align:inherit;white-space:nowrap;background-color:transparent;border:0;border-radius:var(--tblr-dropdown-item-border-radius, 0)}.dropdown-item:hover,.dropdown-item:focus{color:var(--tblr-dropdown-link-hover-color);text-decoration:none;background-color:var(--tblr-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--tblr-dropdown-link-active-color);text-decoration:none;background-color:var(--tblr-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--tblr-dropdown-link-disabled-color);pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--tblr-dropdown-header-padding-y) var(--tblr-dropdown-header-padding-x);margin-bottom:0;font-size:.765625rem;color:var(--tblr-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--tblr-dropdown-item-padding-y) var(--tblr-dropdown-item-padding-x);color:var(--tblr-dropdown-link-color)}.dropdown-menu-dark{--tblr-dropdown-color: #d1d5db;--tblr-dropdown-bg: #1f2937;--tblr-dropdown-border-color: var(--tblr-border-color-translucent);--tblr-dropdown-box-shadow: ;--tblr-dropdown-link-color: #d1d5db;--tblr-dropdown-link-hover-color: #ffffff;--tblr-dropdown-divider-bg: var(--tblr-border-color-translucent);--tblr-dropdown-link-hover-bg: rgba(255, 255, 255, .15);--tblr-dropdown-link-active-color: var(--tblr-primary);--tblr-dropdown-link-active-bg: var(--tblr-active-bg);--tblr-dropdown-link-disabled-color: #6b7280;--tblr-dropdown-header-color: #6b7280}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:var(--tblr-border-radius)}.btn-group>:not(.btn-check:first-child)+.btn,.btn-group>.btn-group:not(:first-child){margin-left:calc(-1 * var(--tblr-border-width))}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn,.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after,.dropend .dropdown-toggle-split:after{margin-left:0}.dropstart .dropdown-toggle-split:before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:1.125rem;padding-left:1.125rem}.btn-group.show .dropdown-toggle{box-shadow:inset 0 3px 5px #00000020}.btn-group.show .dropdown-toggle.btn-link{box-shadow:none}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:calc(-1 * var(--tblr-border-width))}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:nth-child(n+3),.btn-group-vertical>:not(.btn-check)+.btn,.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--tblr-nav-link-padding-x: .75rem;--tblr-nav-link-padding-y: .5rem;--tblr-nav-link-font-weight: ;--tblr-nav-link-color: var(--tblr-gray-500);--tblr-nav-link-hover-color: var(--tblr-link-hover-color);--tblr-nav-link-disabled-color: var(--tblr-disabled-color);display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--tblr-nav-link-padding-y) var(--tblr-nav-link-padding-x);font-size:var(--tblr-nav-link-font-size);font-weight:var(--tblr-nav-link-font-weight);color:var(--tblr-nav-link-color);background:none;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.nav-link:hover,.nav-link:focus{color:var(--tblr-nav-link-hover-color);text-decoration:none}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.nav-link.disabled,.nav-link:disabled{color:var(--tblr-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--tblr-nav-tabs-border-width: var(--tblr-border-width);--tblr-nav-tabs-border-color: var(--tblr-border-color);--tblr-nav-tabs-border-radius: var(--tblr-border-radius);--tblr-nav-tabs-link-hover-border-color: var(--tblr-border-color) var(--tblr-border-color) var(--tblr-border-color);--tblr-nav-tabs-link-active-color: var(--tblr-body-color);--tblr-nav-tabs-link-active-bg: var(--tblr-body-bg);--tblr-nav-tabs-link-active-border-color: var(--tblr-border-color) var(--tblr-border-color) var(--tblr-border-color);border-bottom:var(--tblr-nav-tabs-border-width) solid var(--tblr-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1 * var(--tblr-nav-tabs-border-width));border:var(--tblr-nav-tabs-border-width) solid transparent;border-top-left-radius:var(--tblr-nav-tabs-border-radius);border-top-right-radius:var(--tblr-nav-tabs-border-radius)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--tblr-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--tblr-nav-tabs-link-active-color);background-color:var(--tblr-nav-tabs-link-active-bg);border-color:var(--tblr-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1 * var(--tblr-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--tblr-nav-pills-border-radius: var(--tblr-border-radius);--tblr-nav-pills-link-active-color: var(--tblr-primary);--tblr-nav-pills-link-active-bg: rgba(var(--tblr-secondary-rgb), .15)}.nav-pills .nav-link{border-radius:var(--tblr-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--tblr-nav-pills-link-active-color);background-color:var(--tblr-nav-pills-link-active-bg)}.nav-underline{--tblr-nav-underline-gap: 1rem;--tblr-nav-underline-border-width: .125rem;--tblr-nav-underline-link-active-color: var(--tblr-emphasis-color);gap:var(--tblr-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--tblr-nav-underline-border-width) solid transparent}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:600;color:var(--tblr-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-grow:1;flex-basis:0;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--tblr-navbar-padding-x: 0;--tblr-navbar-padding-y: .25rem;--tblr-navbar-color: var(--tblr-secondary);--tblr-navbar-hover-color: var(--tblr-body-color);--tblr-navbar-disabled-color: var(--tblr-disabled-color);--tblr-navbar-active-color: var(--tblr-body-color);--tblr-navbar-brand-padding-y: .5rem;--tblr-navbar-brand-margin-end: 1rem;--tblr-navbar-brand-font-size: 1.25rem;--tblr-navbar-brand-color: var(--tblr-body-color);--tblr-navbar-brand-hover-color: var(--tblr-body-color);--tblr-navbar-nav-link-padding-x: .75rem;--tblr-navbar-toggler-padding-y: 0;--tblr-navbar-toggler-padding-x: 0;--tblr-navbar-toggler-font-size: 1rem;--tblr-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2831, 41, 55, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--tblr-navbar-toggler-border-color: rgba(var(--tblr-emphasis-color-rgb), .15);--tblr-navbar-toggler-border-radius: var(--tblr-border-radius);--tblr-navbar-toggler-focus-width: 0;--tblr-navbar-toggler-transition: box-shadow .15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--tblr-navbar-padding-y) var(--tblr-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--tblr-navbar-brand-padding-y);padding-bottom:var(--tblr-navbar-brand-padding-y);margin-right:var(--tblr-navbar-brand-margin-end);font-size:var(--tblr-navbar-brand-font-size);color:var(--tblr-navbar-brand-color);white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--tblr-navbar-brand-hover-color);text-decoration:none}.navbar-nav{--tblr-nav-link-padding-x: 0;--tblr-nav-link-padding-y: .5rem;--tblr-nav-link-font-weight: ;--tblr-nav-link-color: var(--tblr-navbar-color);--tblr-nav-link-hover-color: var(--tblr-navbar-hover-color);--tblr-nav-link-disabled-color: var(--tblr-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--tblr-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--tblr-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--tblr-navbar-active-color)}.navbar-collapse{flex-grow:1;flex-basis:100%;align-items:center}.navbar-toggler{padding:var(--tblr-navbar-toggler-padding-y) var(--tblr-navbar-toggler-padding-x);font-size:var(--tblr-navbar-toggler-font-size);line-height:1;color:var(--tblr-navbar-color);background-color:transparent;border:var(--tblr-border-width) solid var(--tblr-navbar-toggler-border-color);border-radius:var(--tblr-navbar-toggler-border-radius);transition:var(--tblr-navbar-toggler-transition)}@media(prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--tblr-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--tblr-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--tblr-scroll-height, 75vh);overflow-y:auto}@media(min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--tblr-navbar-nav-link-padding-x);padding-left:var(--tblr-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--tblr-navbar-nav-link-padding-x);padding-left:var(--tblr-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--tblr-navbar-nav-link-padding-x);padding-left:var(--tblr-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--tblr-navbar-nav-link-padding-x);padding-left:var(--tblr-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--tblr-navbar-nav-link-padding-x);padding-left:var(--tblr-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--tblr-navbar-nav-link-padding-x);padding-left:var(--tblr-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark],body[data-bs-theme=dark] .navbar[data-bs-theme=light]{--tblr-navbar-color: rgba(255, 255, 255, .7);--tblr-navbar-hover-color: rgba(255, 255, 255, .75);--tblr-navbar-disabled-color: var(--tblr-disabled-color);--tblr-navbar-active-color: #ffffff;--tblr-navbar-brand-color: #ffffff;--tblr-navbar-brand-hover-color: #ffffff;--tblr-navbar-toggler-border-color: rgba(255, 255, 255, .1);--tblr-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.7%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon,body[data-bs-theme=dark] [data-bs-theme=light] .navbar-toggler-icon{--tblr-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.7%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--tblr-card-spacer-y: 1rem;--tblr-card-spacer-x: 1.25rem;--tblr-card-title-spacer-y: 1.25rem;--tblr-card-title-color: ;--tblr-card-subtitle-color: ;--tblr-card-border-width: var(--tblr-border-width);--tblr-card-border-color: var(--tblr-border-color-translucent);--tblr-card-border-radius: var(--tblr-border-radius-lg);--tblr-card-box-shadow: var(--tblr-shadow-card);--tblr-card-inner-border-radius: calc(var(--tblr-border-radius-lg) - (var(--tblr-border-width)));--tblr-card-cap-padding-y: 1rem;--tblr-card-cap-padding-x: 1.25rem;--tblr-card-cap-bg: var(--tblr-bg-surface-tertiary);--tblr-card-cap-color: inherit;--tblr-card-height: ;--tblr-card-color: inherit;--tblr-card-bg: var(--tblr-bg-surface);--tblr-card-img-overlay-padding: 1rem;--tblr-card-group-margin: 1.5rem;position:relative;display:flex;flex-direction:column;min-width:0;height:var(--tblr-card-height);color:var(--tblr-body-color);word-wrap:break-word;background-color:var(--tblr-card-bg);background-clip:border-box;border:var(--tblr-card-border-width) solid var(--tblr-card-border-color);border-radius:var(--tblr-card-border-radius);box-shadow:var(--tblr-card-box-shadow)}.card>hr,.card>.hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--tblr-card-inner-border-radius);border-top-right-radius:var(--tblr-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--tblr-card-inner-border-radius);border-bottom-left-radius:var(--tblr-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:var(--tblr-card-spacer-y) var(--tblr-card-spacer-x);color:var(--tblr-card-color)}.card-title{margin-bottom:var(--tblr-card-title-spacer-y);color:var(--tblr-card-title-color)}.card-subtitle{margin-top:calc(-.5 * var(--tblr-card-title-spacer-y));margin-bottom:0;color:var(--tblr-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:var(--tblr-card-spacer-x)}.card-header{padding:var(--tblr-card-cap-padding-y) var(--tblr-card-cap-padding-x);margin-bottom:0;color:var(--tblr-card-cap-color);background-color:var(--tblr-card-cap-bg);border-bottom:var(--tblr-card-border-width) solid var(--tblr-card-border-color)}.card-header:first-child{border-radius:var(--tblr-card-inner-border-radius) var(--tblr-card-inner-border-radius) 0 0}.card-footer{padding:var(--tblr-card-cap-padding-y) var(--tblr-card-cap-padding-x);color:var(--tblr-card-cap-color);background-color:var(--tblr-card-cap-bg);border-top:var(--tblr-card-border-width) solid var(--tblr-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--tblr-card-inner-border-radius) var(--tblr-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-.5 * var(--tblr-card-cap-padding-x));margin-bottom:calc(-1 * var(--tblr-card-cap-padding-y));margin-left:calc(-.5 * var(--tblr-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--tblr-card-bg);border-bottom-color:var(--tblr-card-bg)}.card-header-pills{margin-right:calc(-.5 * var(--tblr-card-cap-padding-x));margin-left:calc(-.5 * var(--tblr-card-cap-padding-x))}.card-img-overlay{position:absolute;inset:0;padding:var(--tblr-card-img-overlay-padding);border-radius:var(--tblr-card-inner-border-radius)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--tblr-card-inner-border-radius);border-top-right-radius:var(--tblr-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--tblr-card-inner-border-radius);border-bottom-left-radius:var(--tblr-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--tblr-card-group-margin)}@media(min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child)>.card-img-top,.card-group>.card:not(:last-child)>.card-header{border-top-right-radius:0}.card-group>.card:not(:last-child)>.card-img-bottom,.card-group>.card:not(:last-child)>.card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child)>.card-img-top,.card-group>.card:not(:first-child)>.card-header{border-top-left-radius:0}.card-group>.card:not(:first-child)>.card-img-bottom,.card-group>.card:not(:first-child)>.card-footer{border-bottom-left-radius:0}}.pagination{--tblr-pagination-padding-x: .25rem;--tblr-pagination-padding-y: calc(.25rem + 1px) ;--tblr-pagination-font-size: .875rem;--tblr-pagination-color: var(--tblr-body-color);--tblr-pagination-bg: transparent;--tblr-pagination-border-width: 1px;--tblr-pagination-border-color: transparent;--tblr-pagination-border-radius: var(--tblr-border-radius);--tblr-pagination-hover-color: var(--tblr-link-hover-color);--tblr-pagination-hover-bg: var(--tblr-active-bg);--tblr-pagination-hover-border-color: var(--tblr-pagination-border-color);--tblr-pagination-focus-color: var(--tblr-link-hover-color);--tblr-pagination-focus-bg: var(--tblr-secondary-bg);--tblr-pagination-focus-box-shadow: 0 0 0 .25rem rgba(var(--tblr-primary-rgb), .25);--tblr-pagination-active-color: #ffffff;--tblr-pagination-active-bg: var(--tblr-primary);--tblr-pagination-active-border-color: var(--tblr-primary);--tblr-pagination-disabled-color: var(--tblr-disabled-color);--tblr-pagination-disabled-bg: transparent;--tblr-pagination-disabled-border-color: var(--tblr-pagination-border-color);display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--tblr-pagination-padding-y) var(--tblr-pagination-padding-x);font-size:var(--tblr-pagination-font-size);color:var(--tblr-pagination-color);background-color:var(--tblr-pagination-bg);border:var(--tblr-pagination-border-width) solid var(--tblr-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--tblr-pagination-hover-color);text-decoration:none;background-color:var(--tblr-pagination-hover-bg);border-color:var(--tblr-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--tblr-pagination-focus-color);background-color:var(--tblr-pagination-focus-bg);outline:0;box-shadow:var(--tblr-pagination-focus-box-shadow)}.page-link.active,.active>.page-link{z-index:3;color:var(--tblr-pagination-active-color);background-color:var(--tblr-pagination-active-bg);border-color:var(--tblr-pagination-active-border-color)}.page-link.disabled,.disabled>.page-link{color:var(--tblr-pagination-disabled-color);pointer-events:none;background-color:var(--tblr-pagination-disabled-bg);border-color:var(--tblr-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item:first-child .page-link{border-top-left-radius:var(--tblr-pagination-border-radius);border-bottom-left-radius:var(--tblr-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--tblr-pagination-border-radius);border-bottom-right-radius:var(--tblr-pagination-border-radius)}.pagination-lg{--tblr-pagination-padding-x: 1.5rem;--tblr-pagination-padding-y: .75rem;--tblr-pagination-font-size: 1.09375rem;--tblr-pagination-border-radius: var(--tblr-border-radius-lg)}.pagination-sm{--tblr-pagination-padding-x: .5rem;--tblr-pagination-padding-y: .25rem;--tblr-pagination-font-size: .765625rem;--tblr-pagination-border-radius: var(--tblr-border-radius-sm)}@keyframes progress-bar-stripes{0%{background-position-x:var(--tblr-progress-height)}}.progress,.progress-stacked{--tblr-progress-height: .5rem;--tblr-progress-font-size: .65625rem;--tblr-progress-bg: var(--tblr-border-color);--tblr-progress-border-radius: var(--tblr-border-radius);--tblr-progress-box-shadow: var(--tblr-box-shadow-inset);--tblr-progress-bar-color: #ffffff;--tblr-progress-bar-bg: var(--tblr-primary);--tblr-progress-bar-transition: width .6s ease;display:flex;height:var(--tblr-progress-height);overflow:hidden;font-size:var(--tblr-progress-font-size);background-color:var(--tblr-progress-bg);border-radius:var(--tblr-progress-border-radius);box-shadow:var(--tblr-progress-box-shadow)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:var(--tblr-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--tblr-progress-bar-bg);transition:var(--tblr-progress-bar-transition)}@media(prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:var(--tblr-progress-height) var(--tblr-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.list-group{--tblr-list-group-color: var(--tblr-body-color);--tblr-list-group-bg: inherit;--tblr-list-group-border-color: var(--tblr-border-color);--tblr-list-group-border-width: var(--tblr-border-width);--tblr-list-group-border-radius: var(--tblr-border-radius);--tblr-list-group-item-padding-x: 1.25rem;--tblr-list-group-item-padding-y: 1rem;--tblr-list-group-action-color: inherit;--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: rgba(var(--tblr-secondary-rgb), .08);--tblr-list-group-action-active-color: var(--tblr-body-color);--tblr-list-group-action-active-bg: var(--tblr-secondary-bg);--tblr-list-group-disabled-color: var(--tblr-secondary-color);--tblr-list-group-disabled-bg: inherit;--tblr-list-group-active-color: inherit;--tblr-list-group-active-bg: var(--tblr-active-bg);--tblr-list-group-active-border-color: var(--tblr-border-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--tblr-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item:before{content:counters(section,".") ". ";counter-increment:section}.list-group-item{position:relative;display:block;padding:var(--tblr-list-group-item-padding-y) var(--tblr-list-group-item-padding-x);color:var(--tblr-list-group-color);background-color:var(--tblr-list-group-bg);border:var(--tblr-list-group-border-width) solid var(--tblr-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--tblr-list-group-disabled-color);pointer-events:none;background-color:var(--tblr-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--tblr-list-group-active-color);background-color:var(--tblr-list-group-active-bg);border-color:var(--tblr-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1 * var(--tblr-list-group-border-width));border-top-width:var(--tblr-list-group-border-width)}.list-group-item-action{width:100%;color:var(--tblr-list-group-action-color);text-align:inherit}.list-group-item-action:not(.active):hover,.list-group-item-action:not(.active):focus{z-index:1;color:var(--tblr-list-group-action-hover-color);text-decoration:none;background-color:var(--tblr-list-group-action-hover-bg)}.list-group-item-action:not(.active):active{color:var(--tblr-list-group-action-active-color);background-color:var(--tblr-list-group-action-active-bg)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--tblr-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--tblr-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--tblr-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--tblr-list-group-border-width));border-left-width:var(--tblr-list-group-border-width)}@media(min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--tblr-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--tblr-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--tblr-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--tblr-list-group-border-width));border-left-width:var(--tblr-list-group-border-width)}}@media(min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--tblr-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--tblr-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--tblr-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--tblr-list-group-border-width));border-left-width:var(--tblr-list-group-border-width)}}@media(min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--tblr-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--tblr-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--tblr-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--tblr-list-group-border-width));border-left-width:var(--tblr-list-group-border-width)}}@media(min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--tblr-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--tblr-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--tblr-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--tblr-list-group-border-width));border-left-width:var(--tblr-list-group-border-width)}}@media(min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--tblr-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--tblr-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--tblr-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--tblr-list-group-border-width));border-left-width:var(--tblr-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--tblr-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{--tblr-list-group-color: var(--tblr-primary-text-emphasis);--tblr-list-group-bg: var(--tblr-primary-bg-subtle);--tblr-list-group-border-color: var(--tblr-primary-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-primary-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-primary-border-subtle);--tblr-list-group-active-color: var(--tblr-primary-bg-subtle);--tblr-list-group-active-bg: var(--tblr-primary-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-primary-text-emphasis)}.list-group-item-secondary{--tblr-list-group-color: var(--tblr-secondary-text-emphasis);--tblr-list-group-bg: var(--tblr-secondary-bg-subtle);--tblr-list-group-border-color: var(--tblr-secondary-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-secondary-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-secondary-border-subtle);--tblr-list-group-active-color: var(--tblr-secondary-bg-subtle);--tblr-list-group-active-bg: var(--tblr-secondary-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-secondary-text-emphasis)}.list-group-item-success{--tblr-list-group-color: var(--tblr-success-text-emphasis);--tblr-list-group-bg: var(--tblr-success-bg-subtle);--tblr-list-group-border-color: var(--tblr-success-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-success-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-success-border-subtle);--tblr-list-group-active-color: var(--tblr-success-bg-subtle);--tblr-list-group-active-bg: var(--tblr-success-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-success-text-emphasis)}.list-group-item-info{--tblr-list-group-color: var(--tblr-info-text-emphasis);--tblr-list-group-bg: var(--tblr-info-bg-subtle);--tblr-list-group-border-color: var(--tblr-info-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-info-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-info-border-subtle);--tblr-list-group-active-color: var(--tblr-info-bg-subtle);--tblr-list-group-active-bg: var(--tblr-info-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-info-text-emphasis)}.list-group-item-warning{--tblr-list-group-color: var(--tblr-warning-text-emphasis);--tblr-list-group-bg: var(--tblr-warning-bg-subtle);--tblr-list-group-border-color: var(--tblr-warning-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-warning-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-warning-border-subtle);--tblr-list-group-active-color: var(--tblr-warning-bg-subtle);--tblr-list-group-active-bg: var(--tblr-warning-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-warning-text-emphasis)}.list-group-item-danger{--tblr-list-group-color: var(--tblr-danger-text-emphasis);--tblr-list-group-bg: var(--tblr-danger-bg-subtle);--tblr-list-group-border-color: var(--tblr-danger-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-danger-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-danger-border-subtle);--tblr-list-group-active-color: var(--tblr-danger-bg-subtle);--tblr-list-group-active-bg: var(--tblr-danger-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-danger-text-emphasis)}.list-group-item-light{--tblr-list-group-color: var(--tblr-light-text-emphasis);--tblr-list-group-bg: var(--tblr-light-bg-subtle);--tblr-list-group-border-color: var(--tblr-light-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-light-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-light-border-subtle);--tblr-list-group-active-color: var(--tblr-light-bg-subtle);--tblr-list-group-active-bg: var(--tblr-light-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-light-text-emphasis)}.list-group-item-dark{--tblr-list-group-color: var(--tblr-dark-text-emphasis);--tblr-list-group-bg: var(--tblr-dark-bg-subtle);--tblr-list-group-border-color: var(--tblr-dark-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-dark-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-dark-border-subtle);--tblr-list-group-active-color: var(--tblr-dark-bg-subtle);--tblr-list-group-active-bg: var(--tblr-dark-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-dark-text-emphasis)}.list-group-item-muted{--tblr-list-group-color: var(--tblr-muted-text-emphasis);--tblr-list-group-bg: var(--tblr-muted-bg-subtle);--tblr-list-group-border-color: var(--tblr-muted-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-muted-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-muted-border-subtle);--tblr-list-group-active-color: var(--tblr-muted-bg-subtle);--tblr-list-group-active-bg: var(--tblr-muted-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-muted-text-emphasis)}.list-group-item-blue{--tblr-list-group-color: var(--tblr-blue-text-emphasis);--tblr-list-group-bg: var(--tblr-blue-bg-subtle);--tblr-list-group-border-color: var(--tblr-blue-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-blue-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-blue-border-subtle);--tblr-list-group-active-color: var(--tblr-blue-bg-subtle);--tblr-list-group-active-bg: var(--tblr-blue-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-blue-text-emphasis)}.list-group-item-azure{--tblr-list-group-color: var(--tblr-azure-text-emphasis);--tblr-list-group-bg: var(--tblr-azure-bg-subtle);--tblr-list-group-border-color: var(--tblr-azure-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-azure-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-azure-border-subtle);--tblr-list-group-active-color: var(--tblr-azure-bg-subtle);--tblr-list-group-active-bg: var(--tblr-azure-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-azure-text-emphasis)}.list-group-item-indigo{--tblr-list-group-color: var(--tblr-indigo-text-emphasis);--tblr-list-group-bg: var(--tblr-indigo-bg-subtle);--tblr-list-group-border-color: var(--tblr-indigo-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-indigo-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-indigo-border-subtle);--tblr-list-group-active-color: var(--tblr-indigo-bg-subtle);--tblr-list-group-active-bg: var(--tblr-indigo-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-indigo-text-emphasis)}.list-group-item-purple{--tblr-list-group-color: var(--tblr-purple-text-emphasis);--tblr-list-group-bg: var(--tblr-purple-bg-subtle);--tblr-list-group-border-color: var(--tblr-purple-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-purple-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-purple-border-subtle);--tblr-list-group-active-color: var(--tblr-purple-bg-subtle);--tblr-list-group-active-bg: var(--tblr-purple-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-purple-text-emphasis)}.list-group-item-pink{--tblr-list-group-color: var(--tblr-pink-text-emphasis);--tblr-list-group-bg: var(--tblr-pink-bg-subtle);--tblr-list-group-border-color: var(--tblr-pink-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-pink-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-pink-border-subtle);--tblr-list-group-active-color: var(--tblr-pink-bg-subtle);--tblr-list-group-active-bg: var(--tblr-pink-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-pink-text-emphasis)}.list-group-item-red{--tblr-list-group-color: var(--tblr-red-text-emphasis);--tblr-list-group-bg: var(--tblr-red-bg-subtle);--tblr-list-group-border-color: var(--tblr-red-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-red-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-red-border-subtle);--tblr-list-group-active-color: var(--tblr-red-bg-subtle);--tblr-list-group-active-bg: var(--tblr-red-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-red-text-emphasis)}.list-group-item-orange{--tblr-list-group-color: var(--tblr-orange-text-emphasis);--tblr-list-group-bg: var(--tblr-orange-bg-subtle);--tblr-list-group-border-color: var(--tblr-orange-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-orange-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-orange-border-subtle);--tblr-list-group-active-color: var(--tblr-orange-bg-subtle);--tblr-list-group-active-bg: var(--tblr-orange-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-orange-text-emphasis)}.list-group-item-yellow{--tblr-list-group-color: var(--tblr-yellow-text-emphasis);--tblr-list-group-bg: var(--tblr-yellow-bg-subtle);--tblr-list-group-border-color: var(--tblr-yellow-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-yellow-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-yellow-border-subtle);--tblr-list-group-active-color: var(--tblr-yellow-bg-subtle);--tblr-list-group-active-bg: var(--tblr-yellow-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-yellow-text-emphasis)}.list-group-item-lime{--tblr-list-group-color: var(--tblr-lime-text-emphasis);--tblr-list-group-bg: var(--tblr-lime-bg-subtle);--tblr-list-group-border-color: var(--tblr-lime-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-lime-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-lime-border-subtle);--tblr-list-group-active-color: var(--tblr-lime-bg-subtle);--tblr-list-group-active-bg: var(--tblr-lime-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-lime-text-emphasis)}.list-group-item-green{--tblr-list-group-color: var(--tblr-green-text-emphasis);--tblr-list-group-bg: var(--tblr-green-bg-subtle);--tblr-list-group-border-color: var(--tblr-green-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-green-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-green-border-subtle);--tblr-list-group-active-color: var(--tblr-green-bg-subtle);--tblr-list-group-active-bg: var(--tblr-green-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-green-text-emphasis)}.list-group-item-teal{--tblr-list-group-color: var(--tblr-teal-text-emphasis);--tblr-list-group-bg: var(--tblr-teal-bg-subtle);--tblr-list-group-border-color: var(--tblr-teal-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-teal-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-teal-border-subtle);--tblr-list-group-active-color: var(--tblr-teal-bg-subtle);--tblr-list-group-active-bg: var(--tblr-teal-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-teal-text-emphasis)}.list-group-item-cyan{--tblr-list-group-color: var(--tblr-cyan-text-emphasis);--tblr-list-group-bg: var(--tblr-cyan-bg-subtle);--tblr-list-group-border-color: var(--tblr-cyan-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-cyan-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-cyan-border-subtle);--tblr-list-group-active-color: var(--tblr-cyan-bg-subtle);--tblr-list-group-active-bg: var(--tblr-cyan-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-cyan-text-emphasis)}.toast{--tblr-toast-zindex: 1090;--tblr-toast-padding-x: .75rem;--tblr-toast-padding-y: .5rem;--tblr-toast-spacing: calc(var(--tblr-page-padding) * 2);--tblr-toast-max-width: 350px;--tblr-toast-font-size: .875rem;--tblr-toast-color: ;--tblr-toast-bg: var(--tblr-bg-surface);--tblr-toast-border-width: var(--tblr-border-width);--tblr-toast-border-color: var(--tblr-border-color);--tblr-toast-border-radius: var(--tblr-border-radius);--tblr-toast-box-shadow: var(--tblr-box-shadow);--tblr-toast-header-color: var(--tblr-gray-500);--tblr-toast-header-bg: rgba(var(--tblr-body-bg-rgb), .85);--tblr-toast-header-border-color: var(--tblr-border-color);width:var(--tblr-toast-max-width);max-width:100%;font-size:var(--tblr-toast-font-size);color:var(--tblr-toast-color);pointer-events:auto;background-color:var(--tblr-toast-bg);background-clip:padding-box;border:var(--tblr-toast-border-width) solid var(--tblr-toast-border-color);box-shadow:var(--tblr-toast-box-shadow);border-radius:var(--tblr-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--tblr-toast-zindex: 1090;position:absolute;z-index:var(--tblr-toast-zindex);width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--tblr-toast-spacing)}.toast-header{display:flex;align-items:center;padding:var(--tblr-toast-padding-y) var(--tblr-toast-padding-x);color:var(--tblr-toast-header-color);background-color:var(--tblr-toast-header-bg);background-clip:padding-box;border-bottom:var(--tblr-toast-border-width) solid var(--tblr-toast-header-border-color);border-top-left-radius:calc(var(--tblr-toast-border-radius) - var(--tblr-toast-border-width));border-top-right-radius:calc(var(--tblr-toast-border-radius) - var(--tblr-toast-border-width))}.toast-header .btn-close{margin-right:calc(-.5 * var(--tblr-toast-padding-x));margin-left:var(--tblr-toast-padding-x)}.toast-body{padding:var(--tblr-toast-padding-x);word-wrap:break-word}.modal{--tblr-modal-zindex: 1055;--tblr-modal-width: 540px;--tblr-modal-padding: 1.5rem;--tblr-modal-margin: .5rem;--tblr-modal-color: var(--tblr-body-color);--tblr-modal-bg: var(--tblr-bg-surface);--tblr-modal-border-color: transparent;--tblr-modal-border-width: var(--tblr-border-width);--tblr-modal-border-radius: var(--tblr-border-radius-lg);--tblr-modal-box-shadow: var(--tblr-box-shadow-sm);--tblr-modal-inner-border-radius: calc(var(--tblr-modal-border-radius) - 1px);--tblr-modal-header-padding-x: 1.5rem;--tblr-modal-header-padding-y: 1.5rem;--tblr-modal-header-padding: 1.5rem;--tblr-modal-header-border-color: var(--tblr-border-color);--tblr-modal-header-border-width: var(--tblr-border-width);--tblr-modal-title-line-height: 1.4285714286;--tblr-modal-footer-gap: .75rem;--tblr-modal-footer-bg: var(--tblr-bg-surface-tertiary);--tblr-modal-footer-border-color: var(--tblr-border-color);--tblr-modal-footer-border-width: var(--tblr-border-width);position:fixed;top:0;left:0;z-index:var(--tblr-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--tblr-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transform:translateY(-1rem);transition:transform .3s ease-out}@media(prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--tblr-modal-margin) * 2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - var(--tblr-modal-margin) * 2)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;color:var(--tblr-modal-color);pointer-events:auto;background-color:var(--tblr-modal-bg);background-clip:padding-box;border:var(--tblr-modal-border-width) solid var(--tblr-modal-border-color);border-radius:var(--tblr-modal-border-radius);box-shadow:var(--tblr-modal-box-shadow);outline:0}.modal-backdrop{--tblr-backdrop-zindex: 1050;--tblr-backdrop-bg: var(--tblr-gray-800);--tblr-backdrop-opacity: .24;position:fixed;top:0;left:0;z-index:var(--tblr-backdrop-zindex);width:100vw;height:100vh;background-color:var(--tblr-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--tblr-backdrop-opacity)}.modal-header{display:flex;flex-shrink:0;align-items:center;padding:var(--tblr-modal-header-padding);border-bottom:var(--tblr-modal-header-border-width) solid var(--tblr-modal-header-border-color);border-top-left-radius:var(--tblr-modal-inner-border-radius);border-top-right-radius:var(--tblr-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--tblr-modal-header-padding-y) * .5) calc(var(--tblr-modal-header-padding-x) * .5);margin-top:calc(-.5 * var(--tblr-modal-header-padding-y));margin-right:calc(-.5 * var(--tblr-modal-header-padding-x));margin-bottom:calc(-.5 * var(--tblr-modal-header-padding-y));margin-left:auto}.modal-title{margin-bottom:0;line-height:var(--tblr-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;padding:var(--tblr-modal-padding)}.modal-footer{display:flex;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:calc(var(--tblr-modal-padding) - var(--tblr-modal-footer-gap) * .5);background-color:var(--tblr-modal-footer-bg);border-top:var(--tblr-modal-footer-border-width) solid var(--tblr-modal-footer-border-color);border-bottom-right-radius:var(--tblr-modal-inner-border-radius);border-bottom-left-radius:var(--tblr-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--tblr-modal-footer-gap) * .5)}@media(min-width:576px){.modal{--tblr-modal-margin: 1.75rem;--tblr-modal-box-shadow: var(--tblr-box-shadow)}.modal-dialog{max-width:var(--tblr-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--tblr-modal-width: 380px}}@media(min-width:992px){.modal-lg,.modal-xl{--tblr-modal-width: 720px}}@media(min-width:1200px){.modal-xl{--tblr-modal-width: 1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header,.modal-fullscreen .modal-footer{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media(max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header,.modal-fullscreen-sm-down .modal-footer{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media(max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header,.modal-fullscreen-md-down .modal-footer{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media(max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header,.modal-fullscreen-lg-down .modal-footer{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media(max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header,.modal-fullscreen-xl-down .modal-footer{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media(max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header,.modal-fullscreen-xxl-down .modal-footer{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--tblr-tooltip-zindex: 1080;--tblr-tooltip-max-width: 200px;--tblr-tooltip-padding-x: var(--tblr-spacer-3);--tblr-tooltip-padding-y: var(--tblr-spacer-1);--tblr-tooltip-margin: ;--tblr-tooltip-font-size: .765625rem;--tblr-tooltip-color: var(--tblr-text-inverted);--tblr-tooltip-bg: var(--tblr-bg-surface-inverted);--tblr-tooltip-border-radius: var(--tblr-border-radius);--tblr-tooltip-opacity: .9;--tblr-tooltip-arrow-width: .8rem;--tblr-tooltip-arrow-height: .4rem;z-index:var(--tblr-tooltip-zindex);display:block;margin:var(--tblr-tooltip-margin);font-family:var(--tblr-font-sans-serif);font-style:normal;font-weight:400;line-height:1.4285714286;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--tblr-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--tblr-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--tblr-tooltip-arrow-width);height:var(--tblr-tooltip-arrow-height)}.tooltip .tooltip-arrow:before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:calc(-1 * var(--tblr-tooltip-arrow-height))}.bs-tooltip-top .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow:before{top:-1px;border-width:var(--tblr-tooltip-arrow-height) calc(var(--tblr-tooltip-arrow-width) * .5) 0;border-top-color:var(--tblr-tooltip-bg)}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:calc(-1 * var(--tblr-tooltip-arrow-height));width:var(--tblr-tooltip-arrow-height);height:var(--tblr-tooltip-arrow-width)}.bs-tooltip-end .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow:before{right:-1px;border-width:calc(var(--tblr-tooltip-arrow-width) * .5) var(--tblr-tooltip-arrow-height) calc(var(--tblr-tooltip-arrow-width) * .5) 0;border-right-color:var(--tblr-tooltip-bg)}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:calc(-1 * var(--tblr-tooltip-arrow-height))}.bs-tooltip-bottom .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow:before{bottom:-1px;border-width:0 calc(var(--tblr-tooltip-arrow-width) * .5) var(--tblr-tooltip-arrow-height);border-bottom-color:var(--tblr-tooltip-bg)}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:calc(-1 * var(--tblr-tooltip-arrow-height));width:var(--tblr-tooltip-arrow-height);height:var(--tblr-tooltip-arrow-width)}.bs-tooltip-start .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow:before{left:-1px;border-width:calc(var(--tblr-tooltip-arrow-width) * .5) 0 calc(var(--tblr-tooltip-arrow-width) * .5) var(--tblr-tooltip-arrow-height);border-left-color:var(--tblr-tooltip-bg)}.tooltip-inner{max-width:var(--tblr-tooltip-max-width);padding:var(--tblr-tooltip-padding-y) var(--tblr-tooltip-padding-x);color:var(--tblr-tooltip-color);text-align:center;background-color:var(--tblr-tooltip-bg);border-radius:var(--tblr-tooltip-border-radius)}.popover{--tblr-popover-zindex: 1070;--tblr-popover-max-width: 276px;--tblr-popover-font-size: .765625rem;--tblr-popover-bg: var(--tblr-bg-surface);--tblr-popover-border-width: var(--tblr-border-width);--tblr-popover-border-color: var(--tblr-border-color);--tblr-popover-border-radius: var(--tblr-border-radius-lg);--tblr-popover-inner-border-radius: calc(var(--tblr-border-radius-lg) - var(--tblr-border-width));--tblr-popover-box-shadow: var(--tblr-shadow-lg);--tblr-popover-header-padding-x: 1rem;--tblr-popover-header-padding-y: .5rem;--tblr-popover-header-font-size: .875rem;--tblr-popover-header-color: inherit;--tblr-popover-header-bg: transparent;--tblr-popover-body-padding-x: .5rem;--tblr-popover-body-padding-y: .5rem;--tblr-popover-body-color: inherit;--tblr-popover-arrow-width: 1rem;--tblr-popover-arrow-height: .5rem;--tblr-popover-arrow-border: var(--tblr-popover-border-color);z-index:var(--tblr-popover-zindex);display:block;max-width:var(--tblr-popover-max-width);font-family:var(--tblr-font-sans-serif);font-style:normal;font-weight:400;line-height:1.4285714286;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--tblr-popover-font-size);word-wrap:break-word;background-color:var(--tblr-popover-bg);background-clip:padding-box;border:var(--tblr-popover-border-width) solid var(--tblr-popover-border-color);border-radius:var(--tblr-popover-border-radius);box-shadow:var(--tblr-popover-box-shadow)}.popover .popover-arrow{display:block;width:var(--tblr-popover-arrow-width);height:var(--tblr-popover-arrow-height)}.popover .popover-arrow:before,.popover .popover-arrow:after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid;border-width:0}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-1 * (var(--tblr-popover-arrow-height)) - var(--tblr-popover-border-width))}.bs-popover-top>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:before,.bs-popover-top>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:after{border-width:var(--tblr-popover-arrow-height) calc(var(--tblr-popover-arrow-width) * .5) 0}.bs-popover-top>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:before{bottom:0;border-top-color:var(--tblr-popover-arrow-border)}.bs-popover-top>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:after{bottom:var(--tblr-popover-border-width);border-top-color:var(--tblr-popover-bg)}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-1 * (var(--tblr-popover-arrow-height)) - var(--tblr-popover-border-width));width:var(--tblr-popover-arrow-height);height:var(--tblr-popover-arrow-width)}.bs-popover-end>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:before,.bs-popover-end>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:after{border-width:calc(var(--tblr-popover-arrow-width) * .5) var(--tblr-popover-arrow-height) calc(var(--tblr-popover-arrow-width) * .5) 0}.bs-popover-end>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:before{left:0;border-right-color:var(--tblr-popover-arrow-border)}.bs-popover-end>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:after{left:var(--tblr-popover-border-width);border-right-color:var(--tblr-popover-bg)}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-1 * (var(--tblr-popover-arrow-height)) - var(--tblr-popover-border-width))}.bs-popover-bottom>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:before,.bs-popover-bottom>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:after{border-width:0 calc(var(--tblr-popover-arrow-width) * .5) var(--tblr-popover-arrow-height)}.bs-popover-bottom>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:before{top:0;border-bottom-color:var(--tblr-popover-arrow-border)}.bs-popover-bottom>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:after{top:var(--tblr-popover-border-width);border-bottom-color:var(--tblr-popover-bg)}.bs-popover-bottom .popover-header:before,.bs-popover-auto[data-popper-placement^=bottom] .popover-header:before{position:absolute;top:0;left:50%;display:block;width:var(--tblr-popover-arrow-width);margin-left:calc(-.5 * var(--tblr-popover-arrow-width));content:"";border-bottom:var(--tblr-popover-border-width) solid var(--tblr-popover-header-bg)}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-1 * (var(--tblr-popover-arrow-height)) - var(--tblr-popover-border-width));width:var(--tblr-popover-arrow-height);height:var(--tblr-popover-arrow-width)}.bs-popover-start>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:before,.bs-popover-start>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:after{border-width:calc(var(--tblr-popover-arrow-width) * .5) 0 calc(var(--tblr-popover-arrow-width) * .5) var(--tblr-popover-arrow-height)}.bs-popover-start>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:before{right:0;border-left-color:var(--tblr-popover-arrow-border)}.bs-popover-start>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:after{right:var(--tblr-popover-border-width);border-left-color:var(--tblr-popover-bg)}.popover-header{padding:var(--tblr-popover-header-padding-y) var(--tblr-popover-header-padding-x);margin-bottom:0;font-size:var(--tblr-popover-header-font-size);color:var(--tblr-popover-header-color);background-color:var(--tblr-popover-header-bg);border-bottom:var(--tblr-popover-border-width) solid var(--tblr-popover-border-color);border-top-left-radius:var(--tblr-popover-inner-border-radius);border-top-right-radius:var(--tblr-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--tblr-popover-body-padding-y) var(--tblr-popover-body-padding-x);color:var(--tblr-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner:after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;transition:transform .6s ease-in-out}@media(prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translate(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translate(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;filter:var(--tblr-carousel-control-icon-filter);border:0;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion:reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:1.5rem;height:1.5rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='15 18 9 12 15 6'%3e%3c/polyline%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='9 18 15 12 9 6'%3e%3c/polyline%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:var(--tblr-carousel-indicator-active-bg);background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:var(--tblr-carousel-caption-color);text-align:center}.carousel-dark{--tblr-carousel-indicator-active-bg: #000000;--tblr-carousel-caption-color: #000000;--tblr-carousel-control-icon-filter: invert(1) grayscale(100)}:root,[data-bs-theme=light]{--tblr-carousel-indicator-active-bg: #ffffff;--tblr-carousel-caption-color: #ffffff;--tblr-carousel-control-icon-filter: }[data-bs-theme=dark],body[data-bs-theme=dark] [data-bs-theme=light]{--tblr-carousel-indicator-active-bg: #000000;--tblr-carousel-caption-color: #000000;--tblr-carousel-control-icon-filter: invert(1) grayscale(100)}.spinner-grow,.spinner-border{display:inline-block;flex-shrink:0;width:var(--tblr-spinner-width);height:var(--tblr-spinner-height);vertical-align:var(--tblr-spinner-vertical-align);border-radius:50%;animation:var(--tblr-spinner-animation-speed) linear infinite var(--tblr-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{--tblr-spinner-width: 1.5rem;--tblr-spinner-height: 1.5rem;--tblr-spinner-vertical-align: -.125em;--tblr-spinner-border-width: 2px;--tblr-spinner-animation-speed: .75s;--tblr-spinner-animation-name: spinner-border;border:var(--tblr-spinner-border-width) solid currentcolor;border-right-color:transparent}.spinner-border-sm{--tblr-spinner-width: 1rem;--tblr-spinner-height: 1rem;--tblr-spinner-border-width: 1px}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--tblr-spinner-width: 1.5rem;--tblr-spinner-height: 1.5rem;--tblr-spinner-vertical-align: -.125em;--tblr-spinner-animation-speed: .75s;--tblr-spinner-animation-name: spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--tblr-spinner-width: 1rem;--tblr-spinner-height: 1rem}@media(prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{--tblr-spinner-animation-speed: 1.5s}}.offcanvas,.offcanvas-xxl,.offcanvas-xl,.offcanvas-lg,.offcanvas-md,.offcanvas-sm{--tblr-offcanvas-zindex: 1045;--tblr-offcanvas-width: 400px;--tblr-offcanvas-height: 30vh;--tblr-offcanvas-padding-x: 1.5rem;--tblr-offcanvas-padding-y: 1.5rem;--tblr-offcanvas-color: var(--tblr-body-color);--tblr-offcanvas-bg: var(--tblr-bg-surface);--tblr-offcanvas-border-width: var(--tblr-border-width);--tblr-offcanvas-border-color: var(--tblr-border-color);--tblr-offcanvas-box-shadow: var(--tblr-box-shadow-sm);--tblr-offcanvas-transition: transform .3s ease-in-out;--tblr-offcanvas-title-line-height: 1.4285714286}@media(max-width:575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--tblr-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--tblr-offcanvas-color);visibility:hidden;background-color:var(--tblr-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--tblr-offcanvas-box-shadow);transition:var(--tblr-offcanvas-transition)}}@media(max-width:575.98px)and (prefers-reduced-motion:reduce){.offcanvas-sm{transition:none}}@media(max-width:575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--tblr-offcanvas-width);border-right:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--tblr-offcanvas-width);border-left:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-bottom:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-top:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.showing,.offcanvas-sm.show:not(.hiding){transform:none}.offcanvas-sm.showing,.offcanvas-sm.hiding,.offcanvas-sm.show{visibility:visible}}@media(min-width:576px){.offcanvas-sm{--tblr-offcanvas-height: auto;--tblr-offcanvas-border-width: 0;background-color:transparent!important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media(max-width:767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--tblr-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--tblr-offcanvas-color);visibility:hidden;background-color:var(--tblr-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--tblr-offcanvas-box-shadow);transition:var(--tblr-offcanvas-transition)}}@media(max-width:767.98px)and (prefers-reduced-motion:reduce){.offcanvas-md{transition:none}}@media(max-width:767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--tblr-offcanvas-width);border-right:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--tblr-offcanvas-width);border-left:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-bottom:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-top:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.showing,.offcanvas-md.show:not(.hiding){transform:none}.offcanvas-md.showing,.offcanvas-md.hiding,.offcanvas-md.show{visibility:visible}}@media(min-width:768px){.offcanvas-md{--tblr-offcanvas-height: auto;--tblr-offcanvas-border-width: 0;background-color:transparent!important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media(max-width:991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--tblr-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--tblr-offcanvas-color);visibility:hidden;background-color:var(--tblr-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--tblr-offcanvas-box-shadow);transition:var(--tblr-offcanvas-transition)}}@media(max-width:991.98px)and (prefers-reduced-motion:reduce){.offcanvas-lg{transition:none}}@media(max-width:991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--tblr-offcanvas-width);border-right:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--tblr-offcanvas-width);border-left:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-bottom:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-top:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.showing,.offcanvas-lg.show:not(.hiding){transform:none}.offcanvas-lg.showing,.offcanvas-lg.hiding,.offcanvas-lg.show{visibility:visible}}@media(min-width:992px){.offcanvas-lg{--tblr-offcanvas-height: auto;--tblr-offcanvas-border-width: 0;background-color:transparent!important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media(max-width:1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--tblr-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--tblr-offcanvas-color);visibility:hidden;background-color:var(--tblr-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--tblr-offcanvas-box-shadow);transition:var(--tblr-offcanvas-transition)}}@media(max-width:1199.98px)and (prefers-reduced-motion:reduce){.offcanvas-xl{transition:none}}@media(max-width:1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--tblr-offcanvas-width);border-right:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--tblr-offcanvas-width);border-left:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-bottom:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-top:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.showing,.offcanvas-xl.show:not(.hiding){transform:none}.offcanvas-xl.showing,.offcanvas-xl.hiding,.offcanvas-xl.show{visibility:visible}}@media(min-width:1200px){.offcanvas-xl{--tblr-offcanvas-height: auto;--tblr-offcanvas-border-width: 0;background-color:transparent!important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media(max-width:1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--tblr-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--tblr-offcanvas-color);visibility:hidden;background-color:var(--tblr-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--tblr-offcanvas-box-shadow);transition:var(--tblr-offcanvas-transition)}}@media(max-width:1399.98px)and (prefers-reduced-motion:reduce){.offcanvas-xxl{transition:none}}@media(max-width:1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--tblr-offcanvas-width);border-right:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--tblr-offcanvas-width);border-left:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-bottom:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-top:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.showing,.offcanvas-xxl.show:not(.hiding){transform:none}.offcanvas-xxl.showing,.offcanvas-xxl.hiding,.offcanvas-xxl.show{visibility:visible}}@media(min-width:1400px){.offcanvas-xxl{--tblr-offcanvas-height: auto;--tblr-offcanvas-border-width: 0;background-color:transparent!important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}.offcanvas{position:fixed;bottom:0;z-index:var(--tblr-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--tblr-offcanvas-color);visibility:hidden;background-color:var(--tblr-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--tblr-offcanvas-box-shadow);transition:var(--tblr-offcanvas-transition)}@media(prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--tblr-offcanvas-width);border-right:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--tblr-offcanvas-width);border-left:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-bottom:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-top:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(100%)}.offcanvas.showing,.offcanvas.show:not(.hiding){transform:none}.offcanvas.showing,.offcanvas.hiding,.offcanvas.show{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:var(--tblr-gray-800)}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.24}.offcanvas-header{display:flex;align-items:center;padding:var(--tblr-offcanvas-padding-y) var(--tblr-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--tblr-offcanvas-padding-y) * .5) calc(var(--tblr-offcanvas-padding-x) * .5);margin-top:calc(-.5 * var(--tblr-offcanvas-padding-y));margin-right:calc(-.5 * var(--tblr-offcanvas-padding-x));margin-bottom:calc(-.5 * var(--tblr-offcanvas-padding-y));margin-left:auto}.offcanvas-title{margin-bottom:0;line-height:var(--tblr-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;padding:var(--tblr-offcanvas-padding-y) var(--tblr-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.2}.placeholder.btn:before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.1}}.placeholder-wave{mask-image:linear-gradient(130deg,#000 55%,#000000e6,#000 95%);mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{to{mask-position:-200% 0%}}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.object-fit-contain{object-fit:contain!important}.object-fit-cover{object-fit:cover!important}.object-fit-fill{object-fit:fill!important}.object-fit-scale{object-fit:scale-down!important}.object-fit-none{object-fit:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.overflow-x-auto{overflow-x:auto!important}.overflow-x-hidden{overflow-x:hidden!important}.overflow-x-visible{overflow-x:visible!important}.overflow-x-scroll{overflow-x:scroll!important}.overflow-y-auto{overflow-y:auto!important}.overflow-y-hidden{overflow-y:hidden!important}.overflow-y-visible{overflow-y:visible!important}.overflow-y-scroll{overflow-y:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-inline-grid{display:inline-grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:var(--tblr-box-shadow)!important}.shadow-sm{box-shadow:var(--tblr-box-shadow-sm)!important}.shadow-lg{box-shadow:var(--tblr-box-shadow-lg)!important}.shadow-none{box-shadow:none!important}.focus-ring-primary{--tblr-focus-ring-color: rgba(var(--tblr-primary-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-secondary{--tblr-focus-ring-color: rgba(var(--tblr-secondary-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-success{--tblr-focus-ring-color: rgba(var(--tblr-success-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-info{--tblr-focus-ring-color: rgba(var(--tblr-info-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-warning{--tblr-focus-ring-color: rgba(var(--tblr-warning-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-danger{--tblr-focus-ring-color: rgba(var(--tblr-danger-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-light{--tblr-focus-ring-color: rgba(var(--tblr-light-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-dark{--tblr-focus-ring-color: rgba(var(--tblr-dark-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-muted{--tblr-focus-ring-color: rgba(var(--tblr-muted-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-blue{--tblr-focus-ring-color: rgba(var(--tblr-blue-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-azure{--tblr-focus-ring-color: rgba(var(--tblr-azure-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-indigo{--tblr-focus-ring-color: rgba(var(--tblr-indigo-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-purple{--tblr-focus-ring-color: rgba(var(--tblr-purple-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-pink{--tblr-focus-ring-color: rgba(var(--tblr-pink-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-red{--tblr-focus-ring-color: rgba(var(--tblr-red-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-orange{--tblr-focus-ring-color: rgba(var(--tblr-orange-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-yellow{--tblr-focus-ring-color: rgba(var(--tblr-yellow-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-lime{--tblr-focus-ring-color: rgba(var(--tblr-lime-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-green{--tblr-focus-ring-color: rgba(var(--tblr-green-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-teal{--tblr-focus-ring-color: rgba(var(--tblr-teal-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-cyan{--tblr-focus-ring-color: rgba(var(--tblr-cyan-rgb), var(--tblr-focus-ring-opacity))}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translate(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.border-wide{border:2px var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.border-0{border:0!important}.border-top{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.border-top-wide{border-top:2px var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.border-top-0{border-top:0!important}.border-end{border-right:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.border-end-wide{border-right:2px var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.border-bottom-wide{border-bottom:2px var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.border-start-wide{border-left:2px var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.border-start-0{border-left:0!important}.border-red{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-red-rgb),var(--tblr-border-opacity))!important}.border-green{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-green-rgb),var(--tblr-border-opacity))!important}.border-primary-subtle{border-color:var(--tblr-primary-border-subtle)!important}.border-secondary-subtle{border-color:var(--tblr-secondary-border-subtle)!important}.border-success-subtle{border-color:var(--tblr-success-border-subtle)!important}.border-info-subtle{border-color:var(--tblr-info-border-subtle)!important}.border-warning-subtle{border-color:var(--tblr-warning-border-subtle)!important}.border-danger-subtle{border-color:var(--tblr-danger-border-subtle)!important}.border-light-subtle{border-color:var(--tblr-light-border-subtle)!important}.border-dark-subtle{border-color:var(--tblr-dark-border-subtle)!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.border-opacity-10{--tblr-border-opacity: .1}.border-opacity-25{--tblr-border-opacity: .25}.border-opacity-50{--tblr-border-opacity: .5}.border-opacity-75{--tblr-border-opacity: .75}.border-opacity-100{--tblr-border-opacity: 1}.w-25{width:25%!important}.w-33{width:33.33333%!important}.w-50{width:50%!important}.w-66{width:66.66666%!important}.w-75{width:75%!important}.w-100{width:100%!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-33{height:33.33333%!important}.h-50{height:50%!important}.h-66{height:66.66666%!important}.h-75{height:75%!important}.h-100{height:100%!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:2rem!important}.m-6{margin:2.5rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:2rem!important;margin-left:2rem!important}.mx-6{margin-right:2.5rem!important;margin-left:2.5rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:2rem!important;margin-bottom:2rem!important}.my-6{margin-top:2.5rem!important;margin-bottom:2.5rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:2rem!important}.mt-6{margin-top:2.5rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:2rem!important}.me-6{margin-right:2.5rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:2rem!important}.mb-6{margin-bottom:2.5rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:2rem!important}.ms-6{margin-left:2.5rem!important}.ms-auto{margin-left:auto!important}.m-n1{margin:-.25rem!important}.m-n2{margin:-.5rem!important}.m-n3{margin:-1rem!important}.m-n4{margin:-1.5rem!important}.m-n5{margin:-2rem!important}.m-n6{margin:-2.5rem!important}.mx-n1{margin-right:-.25rem!important;margin-left:-.25rem!important}.mx-n2{margin-right:-.5rem!important;margin-left:-.5rem!important}.mx-n3{margin-right:-1rem!important;margin-left:-1rem!important}.mx-n4{margin-right:-1.5rem!important;margin-left:-1.5rem!important}.mx-n5{margin-right:-2rem!important;margin-left:-2rem!important}.mx-n6{margin-right:-2.5rem!important;margin-left:-2.5rem!important}.my-n1{margin-top:-.25rem!important;margin-bottom:-.25rem!important}.my-n2{margin-top:-.5rem!important;margin-bottom:-.5rem!important}.my-n3{margin-top:-1rem!important;margin-bottom:-1rem!important}.my-n4{margin-top:-1.5rem!important;margin-bottom:-1.5rem!important}.my-n5{margin-top:-2rem!important;margin-bottom:-2rem!important}.my-n6{margin-top:-2.5rem!important;margin-bottom:-2.5rem!important}.mt-n1{margin-top:-.25rem!important}.mt-n2{margin-top:-.5rem!important}.mt-n3{margin-top:-1rem!important}.mt-n4{margin-top:-1.5rem!important}.mt-n5{margin-top:-2rem!important}.mt-n6{margin-top:-2.5rem!important}.me-n1{margin-right:-.25rem!important}.me-n2{margin-right:-.5rem!important}.me-n3{margin-right:-1rem!important}.me-n4{margin-right:-1.5rem!important}.me-n5{margin-right:-2rem!important}.me-n6{margin-right:-2.5rem!important}.mb-n1{margin-bottom:-.25rem!important}.mb-n2{margin-bottom:-.5rem!important}.mb-n3{margin-bottom:-1rem!important}.mb-n4{margin-bottom:-1.5rem!important}.mb-n5{margin-bottom:-2rem!important}.mb-n6{margin-bottom:-2.5rem!important}.ms-n1{margin-left:-.25rem!important}.ms-n2{margin-left:-.5rem!important}.ms-n3{margin-left:-1rem!important}.ms-n4{margin-left:-1.5rem!important}.ms-n5{margin-left:-2rem!important}.ms-n6{margin-left:-2.5rem!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:2rem!important}.p-6{padding:2.5rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:2rem!important;padding-left:2rem!important}.px-6{padding-right:2.5rem!important;padding-left:2.5rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:2rem!important;padding-bottom:2rem!important}.py-6{padding-top:2.5rem!important;padding-bottom:2.5rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:2rem!important}.pt-6{padding-top:2.5rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:2rem!important}.pe-6{padding-right:2.5rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:2rem!important}.pb-6{padding-bottom:2.5rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:2rem!important}.ps-6{padding-left:2.5rem!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:2rem!important}.gap-6{gap:2.5rem!important}.row-gap-0{row-gap:0!important}.row-gap-1{row-gap:.25rem!important}.row-gap-2{row-gap:.5rem!important}.row-gap-3{row-gap:1rem!important}.row-gap-4{row-gap:1.5rem!important}.row-gap-5{row-gap:2rem!important}.row-gap-6{row-gap:2.5rem!important}.column-gap-0{column-gap:0!important}.column-gap-1{column-gap:.25rem!important}.column-gap-2{column-gap:.5rem!important}.column-gap-3{column-gap:1rem!important}.column-gap-4{column-gap:1.5rem!important}.column-gap-5{column-gap:2rem!important}.column-gap-6{column-gap:2.5rem!important}.font-monospace{font-family:var(--tblr-font-monospace)!important}.fs-1{font-size:1.5rem!important}.fs-2{font-size:1.25rem!important}.fs-3{font-size:1rem!important}.fs-4{font-size:.875rem!important}.fs-5{font-size:.75rem!important}.fs-6{font-size:.625rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-lighter{font-weight:lighter!important}.fw-light{font-weight:300!important}.fw-normal{font-weight:400!important}.fw-medium{font-weight:500!important}.fw-semibold,.fw-bold{font-weight:600!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.1428571429!important}.lh-base{line-height:1.4285714286!important}.lh-lg{line-height:1.7142857143!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--tblr-text-opacity: 1;color:rgba(var(--tblr-primary-rgb),var(--tblr-text-opacity))!important}.text-secondary{--tblr-text-opacity: 1;color:rgba(var(--tblr-secondary-rgb),var(--tblr-text-opacity))!important}.text-success{--tblr-text-opacity: 1;color:rgba(var(--tblr-success-rgb),var(--tblr-text-opacity))!important}.text-info{--tblr-text-opacity: 1;color:rgba(var(--tblr-info-rgb),var(--tblr-text-opacity))!important}.text-warning{--tblr-text-opacity: 1;color:rgba(var(--tblr-warning-rgb),var(--tblr-text-opacity))!important}.text-danger{--tblr-text-opacity: 1;color:rgba(var(--tblr-danger-rgb),var(--tblr-text-opacity))!important}.text-light{--tblr-text-opacity: 1;color:rgba(var(--tblr-light-rgb),var(--tblr-text-opacity))!important}.text-dark{--tblr-text-opacity: 1;color:rgba(var(--tblr-dark-rgb),var(--tblr-text-opacity))!important}.text-muted{--tblr-text-opacity: 1;color:var(--tblr-secondary-color)!important}.text-blue{--tblr-text-opacity: 1;color:rgba(var(--tblr-blue-rgb),var(--tblr-text-opacity))!important}.text-azure{--tblr-text-opacity: 1;color:rgba(var(--tblr-azure-rgb),var(--tblr-text-opacity))!important}.text-indigo{--tblr-text-opacity: 1;color:rgba(var(--tblr-indigo-rgb),var(--tblr-text-opacity))!important}.text-purple{--tblr-text-opacity: 1;color:rgba(var(--tblr-purple-rgb),var(--tblr-text-opacity))!important}.text-pink{--tblr-text-opacity: 1;color:rgba(var(--tblr-pink-rgb),var(--tblr-text-opacity))!important}.text-red{--tblr-text-opacity: 1;color:rgba(var(--tblr-red-rgb),var(--tblr-text-opacity))!important}.text-orange{--tblr-text-opacity: 1;color:rgba(var(--tblr-orange-rgb),var(--tblr-text-opacity))!important}.text-yellow{--tblr-text-opacity: 1;color:rgba(var(--tblr-yellow-rgb),var(--tblr-text-opacity))!important}.text-lime{--tblr-text-opacity: 1;color:rgba(var(--tblr-lime-rgb),var(--tblr-text-opacity))!important}.text-green{--tblr-text-opacity: 1;color:rgba(var(--tblr-green-rgb),var(--tblr-text-opacity))!important}.text-teal{--tblr-text-opacity: 1;color:rgba(var(--tblr-teal-rgb),var(--tblr-text-opacity))!important}.text-cyan{--tblr-text-opacity: 1;color:rgba(var(--tblr-cyan-rgb),var(--tblr-text-opacity))!important}.text-black{--tblr-text-opacity: 1;color:rgba(var(--tblr-black-rgb),var(--tblr-text-opacity))!important}.text-white{--tblr-text-opacity: 1;color:rgba(var(--tblr-white-rgb),var(--tblr-text-opacity))!important}.text-body{--tblr-text-opacity: 1;color:rgba(var(--tblr-body-color-rgb),var(--tblr-text-opacity))!important}.text-black-50{--tblr-text-opacity: 1;color:#00000080!important}.text-white-50{--tblr-text-opacity: 1;color:#ffffff80!important}.text-body-secondary{--tblr-text-opacity: 1;color:var(--tblr-secondary-color)!important}.text-body-tertiary{--tblr-text-opacity: 1;color:var(--tblr-tertiary-color)!important}.text-body-emphasis{--tblr-text-opacity: 1;color:var(--tblr-emphasis-color)!important}.text-reset{--tblr-text-opacity: 1;color:inherit!important}.text-opacity-25{--tblr-text-opacity: .25}.text-opacity-50{--tblr-text-opacity: .5}.text-opacity-75{--tblr-text-opacity: .75}.text-opacity-100{--tblr-text-opacity: 1}.text-primary-emphasis{color:var(--tblr-primary-text-emphasis)!important}.text-secondary-emphasis{color:var(--tblr-secondary-text-emphasis)!important}.text-success-emphasis{color:var(--tblr-success-text-emphasis)!important}.text-info-emphasis{color:var(--tblr-info-text-emphasis)!important}.text-warning-emphasis{color:var(--tblr-warning-text-emphasis)!important}.text-danger-emphasis{color:var(--tblr-danger-text-emphasis)!important}.text-light-emphasis{color:var(--tblr-light-text-emphasis)!important}.text-dark-emphasis{color:var(--tblr-dark-text-emphasis)!important}.link-opacity-10,.link-opacity-10-hover:hover{--tblr-link-opacity: .1}.link-opacity-25,.link-opacity-25-hover:hover{--tblr-link-opacity: .25}.link-opacity-50,.link-opacity-50-hover:hover{--tblr-link-opacity: .5}.link-opacity-75,.link-opacity-75-hover:hover{--tblr-link-opacity: .75}.link-opacity-100,.link-opacity-100-hover:hover{--tblr-link-opacity: 1}.link-offset-1,.link-offset-1-hover:hover{text-underline-offset:.125em!important}.link-offset-2,.link-offset-2-hover:hover{text-underline-offset:.25em!important}.link-offset-3,.link-offset-3-hover:hover{text-underline-offset:.375em!important}.link-underline-primary{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-primary-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-secondary{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-secondary-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-success{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-success-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-info{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-info-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-warning{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-warning-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-danger{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-danger-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-light{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-light-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-dark{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-dark-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-muted{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-muted-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-blue{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-blue-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-azure{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-azure-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-indigo{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-indigo-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-purple{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-purple-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-pink{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-pink-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-red{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-red-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-orange{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-orange-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-yellow{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-yellow-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-lime{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-lime-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-green{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-green-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-teal{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-teal-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-cyan{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-cyan-rgb),var(--tblr-link-underline-opacity))!important}.link-underline{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-link-color-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-underline-opacity-0,.link-underline-opacity-0-hover:hover{--tblr-link-underline-opacity: 0}.link-underline-opacity-10,.link-underline-opacity-10-hover:hover{--tblr-link-underline-opacity: .1}.link-underline-opacity-25,.link-underline-opacity-25-hover:hover{--tblr-link-underline-opacity: .25}.link-underline-opacity-50,.link-underline-opacity-50-hover:hover{--tblr-link-underline-opacity: .5}.link-underline-opacity-75,.link-underline-opacity-75-hover:hover{--tblr-link-underline-opacity: .75}.link-underline-opacity-100,.link-underline-opacity-100-hover:hover{--tblr-link-underline-opacity: 1}.bg-primary{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-primary-rgb),var(--tblr-bg-opacity))!important}.bg-secondary{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-secondary-rgb),var(--tblr-bg-opacity))!important}.bg-success{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-success-rgb),var(--tblr-bg-opacity))!important}.bg-info{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-info-rgb),var(--tblr-bg-opacity))!important}.bg-warning{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-warning-rgb),var(--tblr-bg-opacity))!important}.bg-danger{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-danger-rgb),var(--tblr-bg-opacity))!important}.bg-light{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-light-rgb),var(--tblr-bg-opacity))!important}.bg-dark{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-dark-rgb),var(--tblr-bg-opacity))!important}.bg-muted{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-muted-rgb),var(--tblr-bg-opacity))!important}.bg-blue{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-blue-rgb),var(--tblr-bg-opacity))!important}.bg-azure{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-azure-rgb),var(--tblr-bg-opacity))!important}.bg-indigo{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-indigo-rgb),var(--tblr-bg-opacity))!important}.bg-purple{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-purple-rgb),var(--tblr-bg-opacity))!important}.bg-pink{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-pink-rgb),var(--tblr-bg-opacity))!important}.bg-red{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-red-rgb),var(--tblr-bg-opacity))!important}.bg-orange{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-orange-rgb),var(--tblr-bg-opacity))!important}.bg-yellow{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-yellow-rgb),var(--tblr-bg-opacity))!important}.bg-lime{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-lime-rgb),var(--tblr-bg-opacity))!important}.bg-green{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-green-rgb),var(--tblr-bg-opacity))!important}.bg-teal{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-teal-rgb),var(--tblr-bg-opacity))!important}.bg-cyan{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-cyan-rgb),var(--tblr-bg-opacity))!important}.bg-black{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-black-rgb),var(--tblr-bg-opacity))!important}.bg-white{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-white-rgb),var(--tblr-bg-opacity))!important}.bg-body{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-body-bg-rgb),var(--tblr-bg-opacity))!important}.bg-transparent{--tblr-bg-opacity: 1;background-color:transparent!important}.bg-body-secondary{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-secondary-bg-rgb),var(--tblr-bg-opacity))!important}.bg-body-tertiary{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-tertiary-bg-rgb),var(--tblr-bg-opacity))!important}.bg-opacity-10{--tblr-bg-opacity: .1}.bg-opacity-25{--tblr-bg-opacity: .25}.bg-opacity-50{--tblr-bg-opacity: .5}.bg-opacity-75{--tblr-bg-opacity: .75}.bg-opacity-100{--tblr-bg-opacity: 1}.bg-primary-subtle{background-color:var(--tblr-primary-bg-subtle)!important}.bg-secondary-subtle{background-color:var(--tblr-secondary-bg-subtle)!important}.bg-success-subtle{background-color:var(--tblr-success-bg-subtle)!important}.bg-info-subtle{background-color:var(--tblr-info-bg-subtle)!important}.bg-warning-subtle{background-color:var(--tblr-warning-bg-subtle)!important}.bg-danger-subtle{background-color:var(--tblr-danger-bg-subtle)!important}.bg-light-subtle{background-color:var(--tblr-light-bg-subtle)!important}.bg-dark-subtle{background-color:var(--tblr-dark-bg-subtle)!important}.bg-gradient{background-image:var(--tblr-gradient)!important}.user-select-all{user-select:all!important}.user-select-auto{user-select:auto!important}.user-select-none{user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:var(--tblr-border-radius)!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:var(--tblr-border-radius-sm)!important}.rounded-2{border-radius:var(--tblr-border-radius)!important}.rounded-3{border-radius:var(--tblr-border-radius-lg)!important}.rounded-4{border-radius:var(--tblr-border-radius-xl)!important}.rounded-5{border-radius:var(--tblr-border-radius-xxl)!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:var(--tblr-border-radius-pill)!important}.rounded-top{border-top-left-radius:var(--tblr-border-radius)!important;border-top-right-radius:var(--tblr-border-radius)!important}.rounded-top-0{border-top-left-radius:0!important;border-top-right-radius:0!important}.rounded-top-1{border-top-left-radius:var(--tblr-border-radius-sm)!important;border-top-right-radius:var(--tblr-border-radius-sm)!important}.rounded-top-2{border-top-left-radius:var(--tblr-border-radius)!important;border-top-right-radius:var(--tblr-border-radius)!important}.rounded-top-3{border-top-left-radius:var(--tblr-border-radius-lg)!important;border-top-right-radius:var(--tblr-border-radius-lg)!important}.rounded-top-4{border-top-left-radius:var(--tblr-border-radius-xl)!important;border-top-right-radius:var(--tblr-border-radius-xl)!important}.rounded-top-5{border-top-left-radius:var(--tblr-border-radius-xxl)!important;border-top-right-radius:var(--tblr-border-radius-xxl)!important}.rounded-top-circle{border-top-left-radius:50%!important;border-top-right-radius:50%!important}.rounded-top-pill{border-top-left-radius:var(--tblr-border-radius-pill)!important;border-top-right-radius:var(--tblr-border-radius-pill)!important}.rounded-end{border-top-right-radius:var(--tblr-border-radius)!important;border-bottom-right-radius:var(--tblr-border-radius)!important}.rounded-end-0{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.rounded-end-1{border-top-right-radius:var(--tblr-border-radius-sm)!important;border-bottom-right-radius:var(--tblr-border-radius-sm)!important}.rounded-end-2{border-top-right-radius:var(--tblr-border-radius)!important;border-bottom-right-radius:var(--tblr-border-radius)!important}.rounded-end-3{border-top-right-radius:var(--tblr-border-radius-lg)!important;border-bottom-right-radius:var(--tblr-border-radius-lg)!important}.rounded-end-4{border-top-right-radius:var(--tblr-border-radius-xl)!important;border-bottom-right-radius:var(--tblr-border-radius-xl)!important}.rounded-end-5{border-top-right-radius:var(--tblr-border-radius-xxl)!important;border-bottom-right-radius:var(--tblr-border-radius-xxl)!important}.rounded-end-circle{border-top-right-radius:50%!important;border-bottom-right-radius:50%!important}.rounded-end-pill{border-top-right-radius:var(--tblr-border-radius-pill)!important;border-bottom-right-radius:var(--tblr-border-radius-pill)!important}.rounded-bottom{border-bottom-right-radius:var(--tblr-border-radius)!important;border-bottom-left-radius:var(--tblr-border-radius)!important}.rounded-bottom-0{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.rounded-bottom-1{border-bottom-right-radius:var(--tblr-border-radius-sm)!important;border-bottom-left-radius:var(--tblr-border-radius-sm)!important}.rounded-bottom-2{border-bottom-right-radius:var(--tblr-border-radius)!important;border-bottom-left-radius:var(--tblr-border-radius)!important}.rounded-bottom-3{border-bottom-right-radius:var(--tblr-border-radius-lg)!important;border-bottom-left-radius:var(--tblr-border-radius-lg)!important}.rounded-bottom-4{border-bottom-right-radius:var(--tblr-border-radius-xl)!important;border-bottom-left-radius:var(--tblr-border-radius-xl)!important}.rounded-bottom-5{border-bottom-right-radius:var(--tblr-border-radius-xxl)!important;border-bottom-left-radius:var(--tblr-border-radius-xxl)!important}.rounded-bottom-circle{border-bottom-right-radius:50%!important;border-bottom-left-radius:50%!important}.rounded-bottom-pill{border-bottom-right-radius:var(--tblr-border-radius-pill)!important;border-bottom-left-radius:var(--tblr-border-radius-pill)!important}.rounded-start{border-bottom-left-radius:var(--tblr-border-radius)!important;border-top-left-radius:var(--tblr-border-radius)!important}.rounded-start-0{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.rounded-start-1{border-bottom-left-radius:var(--tblr-border-radius-sm)!important;border-top-left-radius:var(--tblr-border-radius-sm)!important}.rounded-start-2{border-bottom-left-radius:var(--tblr-border-radius)!important;border-top-left-radius:var(--tblr-border-radius)!important}.rounded-start-3{border-bottom-left-radius:var(--tblr-border-radius-lg)!important;border-top-left-radius:var(--tblr-border-radius-lg)!important}.rounded-start-4{border-bottom-left-radius:var(--tblr-border-radius-xl)!important;border-top-left-radius:var(--tblr-border-radius-xl)!important}.rounded-start-5{border-bottom-left-radius:var(--tblr-border-radius-xxl)!important;border-top-left-radius:var(--tblr-border-radius-xxl)!important}.rounded-start-circle{border-bottom-left-radius:50%!important;border-top-left-radius:50%!important}.rounded-start-pill{border-bottom-left-radius:var(--tblr-border-radius-pill)!important;border-top-left-radius:var(--tblr-border-radius-pill)!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.z-n1{z-index:-1!important}.z-0{z-index:0!important}.z-1{z-index:1!important}.z-2{z-index:2!important}.z-3{z-index:3!important}.object-contain{object-fit:contain!important}.object-cover{object-fit:cover!important}.object-fill{object-fit:fill!important}.object-scale-down{object-fit:scale-down!important}.object-none{object-fit:none!important}.cursor-auto{cursor:auto!important}.cursor-pointer{cursor:pointer!important}.cursor-move{cursor:move!important}.cursor-not-allowed{cursor:not-allowed!important}.cursor-zoom-in{cursor:zoom-in!important}.cursor-zoom-out{cursor:zoom-out!important}.cursor-default{cursor:default!important}.cursor-none{cursor:none!important}.cursor-help{cursor:help!important}.cursor-progress{cursor:progress!important}.cursor-wait{cursor:wait!important}.cursor-text{cursor:text!important}.cursor-v-text{cursor:vertical-text!important}.cursor-grab{cursor:grab!important}.cursor-grabbing{cursor:grabbing!important}.cursor-crosshair{cursor:crosshair!important}.border-x{border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important;border-right:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.border-x-wide{border-left:2px var(--tblr-border-style) var(--tblr-border-color-translucent)!important;border-right:2px var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.border-x-0{border-left:0!important;border-right:0!important}.border-y{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important;border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.border-y-wide{border-top:2px var(--tblr-border-style) var(--tblr-border-color-translucent)!important;border-bottom:2px var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.border-y-0{border-top:0!important;border-bottom:0!important}.columns-2{columns:2!important}.columns-3{columns:3!important}.columns-4{columns:4!important}.bg-pattern-transparent{background:url('data:image/svg+xml;charset=UTF-8,') repeat center/16px 16px!important}.bg-gradient{background:linear-gradient(var(--tblr-gradient-direction, to right),var(--tblr-gradient-stops, var(--tblr-gradient-from, transparent), var(--tblr-gradient-to, transparent))) no-repeat!important}.bg-gradient-to-t{--tblr-gradient-direction: to top !important}.bg-gradient-to-te{--tblr-gradient-direction: to top right !important}.bg-gradient-to-e{--tblr-gradient-direction: to right !important}.bg-gradient-to-be{--tblr-gradient-direction: to bottom right !important}.bg-gradient-to-b{--tblr-gradient-direction: to bottom !important}.bg-gradient-to-bs{--tblr-gradient-direction: to bottom left !important}.bg-gradient-to-s{--tblr-gradient-direction: to left !important}.bg-gradient-to-ts{--tblr-gradient-direction: to top left !important}.table-auto{table-layout:auto!important}.table-fixed{table-layout:fixed!important}@media(min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.object-fit-sm-contain{object-fit:contain!important}.object-fit-sm-cover{object-fit:cover!important}.object-fit-sm-fill{object-fit:fill!important}.object-fit-sm-scale{object-fit:scale-down!important}.object-fit-sm-none{object-fit:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-inline-grid{display:inline-grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:2rem!important}.m-sm-6{margin:2.5rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:2rem!important;margin-left:2rem!important}.mx-sm-6{margin-right:2.5rem!important;margin-left:2.5rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:2rem!important;margin-bottom:2rem!important}.my-sm-6{margin-top:2.5rem!important;margin-bottom:2.5rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:2rem!important}.mt-sm-6{margin-top:2.5rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:2rem!important}.me-sm-6{margin-right:2.5rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:2rem!important}.mb-sm-6{margin-bottom:2.5rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:2rem!important}.ms-sm-6{margin-left:2.5rem!important}.ms-sm-auto{margin-left:auto!important}.m-sm-n1{margin:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.m-sm-n3{margin:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.m-sm-n5{margin:-2rem!important}.m-sm-n6{margin:-2.5rem!important}.mx-sm-n1{margin-right:-.25rem!important;margin-left:-.25rem!important}.mx-sm-n2{margin-right:-.5rem!important;margin-left:-.5rem!important}.mx-sm-n3{margin-right:-1rem!important;margin-left:-1rem!important}.mx-sm-n4{margin-right:-1.5rem!important;margin-left:-1.5rem!important}.mx-sm-n5{margin-right:-2rem!important;margin-left:-2rem!important}.mx-sm-n6{margin-right:-2.5rem!important;margin-left:-2.5rem!important}.my-sm-n1{margin-top:-.25rem!important;margin-bottom:-.25rem!important}.my-sm-n2{margin-top:-.5rem!important;margin-bottom:-.5rem!important}.my-sm-n3{margin-top:-1rem!important;margin-bottom:-1rem!important}.my-sm-n4{margin-top:-1.5rem!important;margin-bottom:-1.5rem!important}.my-sm-n5{margin-top:-2rem!important;margin-bottom:-2rem!important}.my-sm-n6{margin-top:-2.5rem!important;margin-bottom:-2.5rem!important}.mt-sm-n1{margin-top:-.25rem!important}.mt-sm-n2{margin-top:-.5rem!important}.mt-sm-n3{margin-top:-1rem!important}.mt-sm-n4{margin-top:-1.5rem!important}.mt-sm-n5{margin-top:-2rem!important}.mt-sm-n6{margin-top:-2.5rem!important}.me-sm-n1{margin-right:-.25rem!important}.me-sm-n2{margin-right:-.5rem!important}.me-sm-n3{margin-right:-1rem!important}.me-sm-n4{margin-right:-1.5rem!important}.me-sm-n5{margin-right:-2rem!important}.me-sm-n6{margin-right:-2.5rem!important}.mb-sm-n1{margin-bottom:-.25rem!important}.mb-sm-n2{margin-bottom:-.5rem!important}.mb-sm-n3{margin-bottom:-1rem!important}.mb-sm-n4{margin-bottom:-1.5rem!important}.mb-sm-n5{margin-bottom:-2rem!important}.mb-sm-n6{margin-bottom:-2.5rem!important}.ms-sm-n1{margin-left:-.25rem!important}.ms-sm-n2{margin-left:-.5rem!important}.ms-sm-n3{margin-left:-1rem!important}.ms-sm-n4{margin-left:-1.5rem!important}.ms-sm-n5{margin-left:-2rem!important}.ms-sm-n6{margin-left:-2.5rem!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:2rem!important}.p-sm-6{padding:2.5rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:2rem!important;padding-left:2rem!important}.px-sm-6{padding-right:2.5rem!important;padding-left:2.5rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:2rem!important;padding-bottom:2rem!important}.py-sm-6{padding-top:2.5rem!important;padding-bottom:2.5rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:2rem!important}.pt-sm-6{padding-top:2.5rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:2rem!important}.pe-sm-6{padding-right:2.5rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:2rem!important}.pb-sm-6{padding-bottom:2.5rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:2rem!important}.ps-sm-6{padding-left:2.5rem!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:2rem!important}.gap-sm-6{gap:2.5rem!important}.row-gap-sm-0{row-gap:0!important}.row-gap-sm-1{row-gap:.25rem!important}.row-gap-sm-2{row-gap:.5rem!important}.row-gap-sm-3{row-gap:1rem!important}.row-gap-sm-4{row-gap:1.5rem!important}.row-gap-sm-5{row-gap:2rem!important}.row-gap-sm-6{row-gap:2.5rem!important}.column-gap-sm-0{column-gap:0!important}.column-gap-sm-1{column-gap:.25rem!important}.column-gap-sm-2{column-gap:.5rem!important}.column-gap-sm-3{column-gap:1rem!important}.column-gap-sm-4{column-gap:1.5rem!important}.column-gap-sm-5{column-gap:2rem!important}.column-gap-sm-6{column-gap:2.5rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}.columns-sm-2{columns:2!important}.columns-sm-3{columns:3!important}.columns-sm-4{columns:4!important}}@media(min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.object-fit-md-contain{object-fit:contain!important}.object-fit-md-cover{object-fit:cover!important}.object-fit-md-fill{object-fit:fill!important}.object-fit-md-scale{object-fit:scale-down!important}.object-fit-md-none{object-fit:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-inline-grid{display:inline-grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:2rem!important}.m-md-6{margin:2.5rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:2rem!important;margin-left:2rem!important}.mx-md-6{margin-right:2.5rem!important;margin-left:2.5rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:2rem!important;margin-bottom:2rem!important}.my-md-6{margin-top:2.5rem!important;margin-bottom:2.5rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:2rem!important}.mt-md-6{margin-top:2.5rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:2rem!important}.me-md-6{margin-right:2.5rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:2rem!important}.mb-md-6{margin-bottom:2.5rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:2rem!important}.ms-md-6{margin-left:2.5rem!important}.ms-md-auto{margin-left:auto!important}.m-md-n1{margin:-.25rem!important}.m-md-n2{margin:-.5rem!important}.m-md-n3{margin:-1rem!important}.m-md-n4{margin:-1.5rem!important}.m-md-n5{margin:-2rem!important}.m-md-n6{margin:-2.5rem!important}.mx-md-n1{margin-right:-.25rem!important;margin-left:-.25rem!important}.mx-md-n2{margin-right:-.5rem!important;margin-left:-.5rem!important}.mx-md-n3{margin-right:-1rem!important;margin-left:-1rem!important}.mx-md-n4{margin-right:-1.5rem!important;margin-left:-1.5rem!important}.mx-md-n5{margin-right:-2rem!important;margin-left:-2rem!important}.mx-md-n6{margin-right:-2.5rem!important;margin-left:-2.5rem!important}.my-md-n1{margin-top:-.25rem!important;margin-bottom:-.25rem!important}.my-md-n2{margin-top:-.5rem!important;margin-bottom:-.5rem!important}.my-md-n3{margin-top:-1rem!important;margin-bottom:-1rem!important}.my-md-n4{margin-top:-1.5rem!important;margin-bottom:-1.5rem!important}.my-md-n5{margin-top:-2rem!important;margin-bottom:-2rem!important}.my-md-n6{margin-top:-2.5rem!important;margin-bottom:-2.5rem!important}.mt-md-n1{margin-top:-.25rem!important}.mt-md-n2{margin-top:-.5rem!important}.mt-md-n3{margin-top:-1rem!important}.mt-md-n4{margin-top:-1.5rem!important}.mt-md-n5{margin-top:-2rem!important}.mt-md-n6{margin-top:-2.5rem!important}.me-md-n1{margin-right:-.25rem!important}.me-md-n2{margin-right:-.5rem!important}.me-md-n3{margin-right:-1rem!important}.me-md-n4{margin-right:-1.5rem!important}.me-md-n5{margin-right:-2rem!important}.me-md-n6{margin-right:-2.5rem!important}.mb-md-n1{margin-bottom:-.25rem!important}.mb-md-n2{margin-bottom:-.5rem!important}.mb-md-n3{margin-bottom:-1rem!important}.mb-md-n4{margin-bottom:-1.5rem!important}.mb-md-n5{margin-bottom:-2rem!important}.mb-md-n6{margin-bottom:-2.5rem!important}.ms-md-n1{margin-left:-.25rem!important}.ms-md-n2{margin-left:-.5rem!important}.ms-md-n3{margin-left:-1rem!important}.ms-md-n4{margin-left:-1.5rem!important}.ms-md-n5{margin-left:-2rem!important}.ms-md-n6{margin-left:-2.5rem!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:2rem!important}.p-md-6{padding:2.5rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:2rem!important;padding-left:2rem!important}.px-md-6{padding-right:2.5rem!important;padding-left:2.5rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:2rem!important;padding-bottom:2rem!important}.py-md-6{padding-top:2.5rem!important;padding-bottom:2.5rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:2rem!important}.pt-md-6{padding-top:2.5rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:2rem!important}.pe-md-6{padding-right:2.5rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:2rem!important}.pb-md-6{padding-bottom:2.5rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:2rem!important}.ps-md-6{padding-left:2.5rem!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:2rem!important}.gap-md-6{gap:2.5rem!important}.row-gap-md-0{row-gap:0!important}.row-gap-md-1{row-gap:.25rem!important}.row-gap-md-2{row-gap:.5rem!important}.row-gap-md-3{row-gap:1rem!important}.row-gap-md-4{row-gap:1.5rem!important}.row-gap-md-5{row-gap:2rem!important}.row-gap-md-6{row-gap:2.5rem!important}.column-gap-md-0{column-gap:0!important}.column-gap-md-1{column-gap:.25rem!important}.column-gap-md-2{column-gap:.5rem!important}.column-gap-md-3{column-gap:1rem!important}.column-gap-md-4{column-gap:1.5rem!important}.column-gap-md-5{column-gap:2rem!important}.column-gap-md-6{column-gap:2.5rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}.columns-md-2{columns:2!important}.columns-md-3{columns:3!important}.columns-md-4{columns:4!important}}@media(min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.object-fit-lg-contain{object-fit:contain!important}.object-fit-lg-cover{object-fit:cover!important}.object-fit-lg-fill{object-fit:fill!important}.object-fit-lg-scale{object-fit:scale-down!important}.object-fit-lg-none{object-fit:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-inline-grid{display:inline-grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:2rem!important}.m-lg-6{margin:2.5rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:2rem!important;margin-left:2rem!important}.mx-lg-6{margin-right:2.5rem!important;margin-left:2.5rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:2rem!important;margin-bottom:2rem!important}.my-lg-6{margin-top:2.5rem!important;margin-bottom:2.5rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:2rem!important}.mt-lg-6{margin-top:2.5rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:2rem!important}.me-lg-6{margin-right:2.5rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:2rem!important}.mb-lg-6{margin-bottom:2.5rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:2rem!important}.ms-lg-6{margin-left:2.5rem!important}.ms-lg-auto{margin-left:auto!important}.m-lg-n1{margin:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.m-lg-n3{margin:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.m-lg-n5{margin:-2rem!important}.m-lg-n6{margin:-2.5rem!important}.mx-lg-n1{margin-right:-.25rem!important;margin-left:-.25rem!important}.mx-lg-n2{margin-right:-.5rem!important;margin-left:-.5rem!important}.mx-lg-n3{margin-right:-1rem!important;margin-left:-1rem!important}.mx-lg-n4{margin-right:-1.5rem!important;margin-left:-1.5rem!important}.mx-lg-n5{margin-right:-2rem!important;margin-left:-2rem!important}.mx-lg-n6{margin-right:-2.5rem!important;margin-left:-2.5rem!important}.my-lg-n1{margin-top:-.25rem!important;margin-bottom:-.25rem!important}.my-lg-n2{margin-top:-.5rem!important;margin-bottom:-.5rem!important}.my-lg-n3{margin-top:-1rem!important;margin-bottom:-1rem!important}.my-lg-n4{margin-top:-1.5rem!important;margin-bottom:-1.5rem!important}.my-lg-n5{margin-top:-2rem!important;margin-bottom:-2rem!important}.my-lg-n6{margin-top:-2.5rem!important;margin-bottom:-2.5rem!important}.mt-lg-n1{margin-top:-.25rem!important}.mt-lg-n2{margin-top:-.5rem!important}.mt-lg-n3{margin-top:-1rem!important}.mt-lg-n4{margin-top:-1.5rem!important}.mt-lg-n5{margin-top:-2rem!important}.mt-lg-n6{margin-top:-2.5rem!important}.me-lg-n1{margin-right:-.25rem!important}.me-lg-n2{margin-right:-.5rem!important}.me-lg-n3{margin-right:-1rem!important}.me-lg-n4{margin-right:-1.5rem!important}.me-lg-n5{margin-right:-2rem!important}.me-lg-n6{margin-right:-2.5rem!important}.mb-lg-n1{margin-bottom:-.25rem!important}.mb-lg-n2{margin-bottom:-.5rem!important}.mb-lg-n3{margin-bottom:-1rem!important}.mb-lg-n4{margin-bottom:-1.5rem!important}.mb-lg-n5{margin-bottom:-2rem!important}.mb-lg-n6{margin-bottom:-2.5rem!important}.ms-lg-n1{margin-left:-.25rem!important}.ms-lg-n2{margin-left:-.5rem!important}.ms-lg-n3{margin-left:-1rem!important}.ms-lg-n4{margin-left:-1.5rem!important}.ms-lg-n5{margin-left:-2rem!important}.ms-lg-n6{margin-left:-2.5rem!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:2rem!important}.p-lg-6{padding:2.5rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:2rem!important;padding-left:2rem!important}.px-lg-6{padding-right:2.5rem!important;padding-left:2.5rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:2rem!important;padding-bottom:2rem!important}.py-lg-6{padding-top:2.5rem!important;padding-bottom:2.5rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:2rem!important}.pt-lg-6{padding-top:2.5rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:2rem!important}.pe-lg-6{padding-right:2.5rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:2rem!important}.pb-lg-6{padding-bottom:2.5rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:2rem!important}.ps-lg-6{padding-left:2.5rem!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:2rem!important}.gap-lg-6{gap:2.5rem!important}.row-gap-lg-0{row-gap:0!important}.row-gap-lg-1{row-gap:.25rem!important}.row-gap-lg-2{row-gap:.5rem!important}.row-gap-lg-3{row-gap:1rem!important}.row-gap-lg-4{row-gap:1.5rem!important}.row-gap-lg-5{row-gap:2rem!important}.row-gap-lg-6{row-gap:2.5rem!important}.column-gap-lg-0{column-gap:0!important}.column-gap-lg-1{column-gap:.25rem!important}.column-gap-lg-2{column-gap:.5rem!important}.column-gap-lg-3{column-gap:1rem!important}.column-gap-lg-4{column-gap:1.5rem!important}.column-gap-lg-5{column-gap:2rem!important}.column-gap-lg-6{column-gap:2.5rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}.columns-lg-2{columns:2!important}.columns-lg-3{columns:3!important}.columns-lg-4{columns:4!important}}@media(min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.object-fit-xl-contain{object-fit:contain!important}.object-fit-xl-cover{object-fit:cover!important}.object-fit-xl-fill{object-fit:fill!important}.object-fit-xl-scale{object-fit:scale-down!important}.object-fit-xl-none{object-fit:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-inline-grid{display:inline-grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:2rem!important}.m-xl-6{margin:2.5rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:2rem!important;margin-left:2rem!important}.mx-xl-6{margin-right:2.5rem!important;margin-left:2.5rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:2rem!important;margin-bottom:2rem!important}.my-xl-6{margin-top:2.5rem!important;margin-bottom:2.5rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:2rem!important}.mt-xl-6{margin-top:2.5rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:2rem!important}.me-xl-6{margin-right:2.5rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:2rem!important}.mb-xl-6{margin-bottom:2.5rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:2rem!important}.ms-xl-6{margin-left:2.5rem!important}.ms-xl-auto{margin-left:auto!important}.m-xl-n1{margin:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.m-xl-n3{margin:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.m-xl-n5{margin:-2rem!important}.m-xl-n6{margin:-2.5rem!important}.mx-xl-n1{margin-right:-.25rem!important;margin-left:-.25rem!important}.mx-xl-n2{margin-right:-.5rem!important;margin-left:-.5rem!important}.mx-xl-n3{margin-right:-1rem!important;margin-left:-1rem!important}.mx-xl-n4{margin-right:-1.5rem!important;margin-left:-1.5rem!important}.mx-xl-n5{margin-right:-2rem!important;margin-left:-2rem!important}.mx-xl-n6{margin-right:-2.5rem!important;margin-left:-2.5rem!important}.my-xl-n1{margin-top:-.25rem!important;margin-bottom:-.25rem!important}.my-xl-n2{margin-top:-.5rem!important;margin-bottom:-.5rem!important}.my-xl-n3{margin-top:-1rem!important;margin-bottom:-1rem!important}.my-xl-n4{margin-top:-1.5rem!important;margin-bottom:-1.5rem!important}.my-xl-n5{margin-top:-2rem!important;margin-bottom:-2rem!important}.my-xl-n6{margin-top:-2.5rem!important;margin-bottom:-2.5rem!important}.mt-xl-n1{margin-top:-.25rem!important}.mt-xl-n2{margin-top:-.5rem!important}.mt-xl-n3{margin-top:-1rem!important}.mt-xl-n4{margin-top:-1.5rem!important}.mt-xl-n5{margin-top:-2rem!important}.mt-xl-n6{margin-top:-2.5rem!important}.me-xl-n1{margin-right:-.25rem!important}.me-xl-n2{margin-right:-.5rem!important}.me-xl-n3{margin-right:-1rem!important}.me-xl-n4{margin-right:-1.5rem!important}.me-xl-n5{margin-right:-2rem!important}.me-xl-n6{margin-right:-2.5rem!important}.mb-xl-n1{margin-bottom:-.25rem!important}.mb-xl-n2{margin-bottom:-.5rem!important}.mb-xl-n3{margin-bottom:-1rem!important}.mb-xl-n4{margin-bottom:-1.5rem!important}.mb-xl-n5{margin-bottom:-2rem!important}.mb-xl-n6{margin-bottom:-2.5rem!important}.ms-xl-n1{margin-left:-.25rem!important}.ms-xl-n2{margin-left:-.5rem!important}.ms-xl-n3{margin-left:-1rem!important}.ms-xl-n4{margin-left:-1.5rem!important}.ms-xl-n5{margin-left:-2rem!important}.ms-xl-n6{margin-left:-2.5rem!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:2rem!important}.p-xl-6{padding:2.5rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:2rem!important;padding-left:2rem!important}.px-xl-6{padding-right:2.5rem!important;padding-left:2.5rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:2rem!important;padding-bottom:2rem!important}.py-xl-6{padding-top:2.5rem!important;padding-bottom:2.5rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:2rem!important}.pt-xl-6{padding-top:2.5rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:2rem!important}.pe-xl-6{padding-right:2.5rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:2rem!important}.pb-xl-6{padding-bottom:2.5rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:2rem!important}.ps-xl-6{padding-left:2.5rem!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:2rem!important}.gap-xl-6{gap:2.5rem!important}.row-gap-xl-0{row-gap:0!important}.row-gap-xl-1{row-gap:.25rem!important}.row-gap-xl-2{row-gap:.5rem!important}.row-gap-xl-3{row-gap:1rem!important}.row-gap-xl-4{row-gap:1.5rem!important}.row-gap-xl-5{row-gap:2rem!important}.row-gap-xl-6{row-gap:2.5rem!important}.column-gap-xl-0{column-gap:0!important}.column-gap-xl-1{column-gap:.25rem!important}.column-gap-xl-2{column-gap:.5rem!important}.column-gap-xl-3{column-gap:1rem!important}.column-gap-xl-4{column-gap:1.5rem!important}.column-gap-xl-5{column-gap:2rem!important}.column-gap-xl-6{column-gap:2.5rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}.columns-xl-2{columns:2!important}.columns-xl-3{columns:3!important}.columns-xl-4{columns:4!important}}@media(min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.object-fit-xxl-contain{object-fit:contain!important}.object-fit-xxl-cover{object-fit:cover!important}.object-fit-xxl-fill{object-fit:fill!important}.object-fit-xxl-scale{object-fit:scale-down!important}.object-fit-xxl-none{object-fit:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-inline-grid{display:inline-grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:2rem!important}.m-xxl-6{margin:2.5rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:2rem!important;margin-left:2rem!important}.mx-xxl-6{margin-right:2.5rem!important;margin-left:2.5rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:2rem!important;margin-bottom:2rem!important}.my-xxl-6{margin-top:2.5rem!important;margin-bottom:2.5rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:2rem!important}.mt-xxl-6{margin-top:2.5rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:2rem!important}.me-xxl-6{margin-right:2.5rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:2rem!important}.mb-xxl-6{margin-bottom:2.5rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:2rem!important}.ms-xxl-6{margin-left:2.5rem!important}.ms-xxl-auto{margin-left:auto!important}.m-xxl-n1{margin:-.25rem!important}.m-xxl-n2{margin:-.5rem!important}.m-xxl-n3{margin:-1rem!important}.m-xxl-n4{margin:-1.5rem!important}.m-xxl-n5{margin:-2rem!important}.m-xxl-n6{margin:-2.5rem!important}.mx-xxl-n1{margin-right:-.25rem!important;margin-left:-.25rem!important}.mx-xxl-n2{margin-right:-.5rem!important;margin-left:-.5rem!important}.mx-xxl-n3{margin-right:-1rem!important;margin-left:-1rem!important}.mx-xxl-n4{margin-right:-1.5rem!important;margin-left:-1.5rem!important}.mx-xxl-n5{margin-right:-2rem!important;margin-left:-2rem!important}.mx-xxl-n6{margin-right:-2.5rem!important;margin-left:-2.5rem!important}.my-xxl-n1{margin-top:-.25rem!important;margin-bottom:-.25rem!important}.my-xxl-n2{margin-top:-.5rem!important;margin-bottom:-.5rem!important}.my-xxl-n3{margin-top:-1rem!important;margin-bottom:-1rem!important}.my-xxl-n4{margin-top:-1.5rem!important;margin-bottom:-1.5rem!important}.my-xxl-n5{margin-top:-2rem!important;margin-bottom:-2rem!important}.my-xxl-n6{margin-top:-2.5rem!important;margin-bottom:-2.5rem!important}.mt-xxl-n1{margin-top:-.25rem!important}.mt-xxl-n2{margin-top:-.5rem!important}.mt-xxl-n3{margin-top:-1rem!important}.mt-xxl-n4{margin-top:-1.5rem!important}.mt-xxl-n5{margin-top:-2rem!important}.mt-xxl-n6{margin-top:-2.5rem!important}.me-xxl-n1{margin-right:-.25rem!important}.me-xxl-n2{margin-right:-.5rem!important}.me-xxl-n3{margin-right:-1rem!important}.me-xxl-n4{margin-right:-1.5rem!important}.me-xxl-n5{margin-right:-2rem!important}.me-xxl-n6{margin-right:-2.5rem!important}.mb-xxl-n1{margin-bottom:-.25rem!important}.mb-xxl-n2{margin-bottom:-.5rem!important}.mb-xxl-n3{margin-bottom:-1rem!important}.mb-xxl-n4{margin-bottom:-1.5rem!important}.mb-xxl-n5{margin-bottom:-2rem!important}.mb-xxl-n6{margin-bottom:-2.5rem!important}.ms-xxl-n1{margin-left:-.25rem!important}.ms-xxl-n2{margin-left:-.5rem!important}.ms-xxl-n3{margin-left:-1rem!important}.ms-xxl-n4{margin-left:-1.5rem!important}.ms-xxl-n5{margin-left:-2rem!important}.ms-xxl-n6{margin-left:-2.5rem!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:2rem!important}.p-xxl-6{padding:2.5rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:2rem!important;padding-left:2rem!important}.px-xxl-6{padding-right:2.5rem!important;padding-left:2.5rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:2rem!important;padding-bottom:2rem!important}.py-xxl-6{padding-top:2.5rem!important;padding-bottom:2.5rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:2rem!important}.pt-xxl-6{padding-top:2.5rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:2rem!important}.pe-xxl-6{padding-right:2.5rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:2rem!important}.pb-xxl-6{padding-bottom:2.5rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:2rem!important}.ps-xxl-6{padding-left:2.5rem!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:2rem!important}.gap-xxl-6{gap:2.5rem!important}.row-gap-xxl-0{row-gap:0!important}.row-gap-xxl-1{row-gap:.25rem!important}.row-gap-xxl-2{row-gap:.5rem!important}.row-gap-xxl-3{row-gap:1rem!important}.row-gap-xxl-4{row-gap:1.5rem!important}.row-gap-xxl-5{row-gap:2rem!important}.row-gap-xxl-6{row-gap:2.5rem!important}.column-gap-xxl-0{column-gap:0!important}.column-gap-xxl-1{column-gap:.25rem!important}.column-gap-xxl-2{column-gap:.5rem!important}.column-gap-xxl-3{column-gap:1rem!important}.column-gap-xxl-4{column-gap:1.5rem!important}.column-gap-xxl-5{column-gap:2rem!important}.column-gap-xxl-6{column-gap:2.5rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}.columns-xxl-2{columns:2!important}.columns-xxl-3{columns:3!important}.columns-xxl-4{columns:4!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-inline-grid{display:inline-grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}}:root,:host{--tblr-font-monospace: Roboto Mono;--tblr-font-sans-serif: Inter, system-ui, sans-serif;--tblr-font-serif: Georgia, Times New Roman, times, serif;--tblr-font-comic: Comic Sans MS, Comic Sans, Chalkboard SE, Comic Neue, sans-serif, cursive;--tblr-gray-50: #f9fafb;--tblr-gray-100: #f3f4f6;--tblr-gray-200: #e5e7eb;--tblr-gray-300: #d1d5db;--tblr-gray-400: #9ca3af;--tblr-gray-500: #6b7280;--tblr-gray-600: #4b5563;--tblr-gray-700: #374151;--tblr-gray-800: #1f2937;--tblr-gray-900: #111827;--tblr-gray-950: #030712;--tblr-white: #ffffff;--tblr-black: #000000;--tblr-brand: #00857D;--tblr-primary: #00857D;--tblr-primary-rgb: 0, 133, 125;--tblr-primary-fg: var(--tblr-light);--tblr-primary-darken: rgb(0, 119.7, 112.5);--tblr-primary-darken: color-mix(in oklab, var(--tblr-primary), transparent 20%);--tblr-primary-lt: rgb(229.5, 242.8, 242);--tblr-primary-lt: color-mix(in oklab, var(--tblr-primary) 10%, transparent);--tblr-primary-200: color-mix(in oklab, var(--tblr-primary) 20%, transparent);--tblr-primary-lt-rgb: 230, 243, 242;--tblr-secondary: #6b7280;--tblr-secondary-rgb: 107, 114, 128;--tblr-secondary-fg: var(--tblr-light);--tblr-secondary-darken: rgb(96.3, 102.6, 115.2);--tblr-secondary-darken: color-mix(in oklab, var(--tblr-secondary), transparent 20%);--tblr-secondary-lt: rgb(240.2, 240.9, 242.3);--tblr-secondary-lt: color-mix(in oklab, var(--tblr-secondary) 10%, transparent);--tblr-secondary-200: color-mix(in oklab, var(--tblr-secondary) 20%, transparent);--tblr-secondary-lt-rgb: 240, 241, 242;--tblr-success: #2fb344;--tblr-success-rgb: 47, 179, 68;--tblr-success-fg: var(--tblr-light);--tblr-success-darken: rgb(42.3, 161.1, 61.2);--tblr-success-darken: color-mix(in oklab, var(--tblr-success), transparent 20%);--tblr-success-lt: rgb(234.2, 247.4, 236.3);--tblr-success-lt: color-mix(in oklab, var(--tblr-success) 10%, transparent);--tblr-success-200: color-mix(in oklab, var(--tblr-success) 20%, transparent);--tblr-success-lt-rgb: 234, 247, 236;--tblr-info: #4299e1;--tblr-info-rgb: 66, 153, 225;--tblr-info-fg: var(--tblr-light);--tblr-info-darken: rgb(59.4, 137.7, 202.5);--tblr-info-darken: color-mix(in oklab, var(--tblr-info), transparent 20%);--tblr-info-lt: rgb(236.1, 244.8, 252);--tblr-info-lt: color-mix(in oklab, var(--tblr-info) 10%, transparent);--tblr-info-200: color-mix(in oklab, var(--tblr-info) 20%, transparent);--tblr-info-lt-rgb: 236, 245, 252;--tblr-warning: #f59f00;--tblr-warning-rgb: 245, 159, 0;--tblr-warning-fg: var(--tblr-light);--tblr-warning-darken: rgb(220.5, 143.1, 0);--tblr-warning-darken: color-mix(in oklab, var(--tblr-warning), transparent 20%);--tblr-warning-lt: rgb(254, 245.4, 229.5);--tblr-warning-lt: color-mix(in oklab, var(--tblr-warning) 10%, transparent);--tblr-warning-200: color-mix(in oklab, var(--tblr-warning) 20%, transparent);--tblr-warning-lt-rgb: 254, 245, 230;--tblr-danger: #d63939;--tblr-danger-rgb: 214, 57, 57;--tblr-danger-fg: var(--tblr-light);--tblr-danger-darken: rgb(192.6, 51.3, 51.3);--tblr-danger-darken: color-mix(in oklab, var(--tblr-danger), transparent 20%);--tblr-danger-lt: rgb(250.9, 235.2, 235.2);--tblr-danger-lt: color-mix(in oklab, var(--tblr-danger) 10%, transparent);--tblr-danger-200: color-mix(in oklab, var(--tblr-danger) 20%, transparent);--tblr-danger-lt-rgb: 251, 235, 235;--tblr-light: #f9fafb;--tblr-light-rgb: 249, 250, 251;--tblr-light-fg: var(--tblr-dark);--tblr-light-darken: rgb(224.1, 225, 225.9);--tblr-light-darken: color-mix(in oklab, var(--tblr-light), transparent 20%);--tblr-light-lt: rgb(254.4, 254.5, 254.6);--tblr-light-lt: color-mix(in oklab, var(--tblr-light) 10%, transparent);--tblr-light-200: color-mix(in oklab, var(--tblr-light) 20%, transparent);--tblr-light-lt-rgb: 254, 255, 255;--tblr-dark: #1f2937;--tblr-dark-rgb: 31, 41, 55;--tblr-dark-fg: var(--tblr-light);--tblr-dark-darken: rgb(27.9, 36.9, 49.5);--tblr-dark-darken: color-mix(in oklab, var(--tblr-dark), transparent 20%);--tblr-dark-lt: rgb(232.6, 233.6, 235);--tblr-dark-lt: color-mix(in oklab, var(--tblr-dark) 10%, transparent);--tblr-dark-200: color-mix(in oklab, var(--tblr-dark) 20%, transparent);--tblr-dark-lt-rgb: 233, 234, 235;--tblr-muted: #6b7280;--tblr-muted-rgb: 107, 114, 128;--tblr-muted-fg: var(--tblr-light);--tblr-muted-darken: rgb(96.3, 102.6, 115.2);--tblr-muted-darken: color-mix(in oklab, var(--tblr-muted), transparent 20%);--tblr-muted-lt: rgb(240.2, 240.9, 242.3);--tblr-muted-lt: color-mix(in oklab, var(--tblr-muted) 10%, transparent);--tblr-muted-200: color-mix(in oklab, var(--tblr-muted) 20%, transparent);--tblr-muted-lt-rgb: 240, 241, 242;--tblr-blue: #066fd1;--tblr-blue-rgb: 6, 111, 209;--tblr-blue-fg: var(--tblr-light);--tblr-blue-darken: rgb(5.4, 99.9, 188.1);--tblr-blue-darken: color-mix(in oklab, var(--tblr-blue), transparent 20%);--tblr-blue-lt: rgb(230.1, 240.6, 250.4);--tblr-blue-lt: color-mix(in oklab, var(--tblr-blue) 10%, transparent);--tblr-blue-200: color-mix(in oklab, var(--tblr-blue) 20%, transparent);--tblr-blue-lt-rgb: 230, 241, 250;--tblr-azure: #4299e1;--tblr-azure-rgb: 66, 153, 225;--tblr-azure-fg: var(--tblr-light);--tblr-azure-darken: rgb(59.4, 137.7, 202.5);--tblr-azure-darken: color-mix(in oklab, var(--tblr-azure), transparent 20%);--tblr-azure-lt: rgb(236.1, 244.8, 252);--tblr-azure-lt: color-mix(in oklab, var(--tblr-azure) 10%, transparent);--tblr-azure-200: color-mix(in oklab, var(--tblr-azure) 20%, transparent);--tblr-azure-lt-rgb: 236, 245, 252;--tblr-indigo: #4263eb;--tblr-indigo-rgb: 66, 99, 235;--tblr-indigo-fg: var(--tblr-light);--tblr-indigo-darken: rgb(59.4, 89.1, 211.5);--tblr-indigo-darken: color-mix(in oklab, var(--tblr-indigo), transparent 20%);--tblr-indigo-lt: rgb(236.1, 239.4, 253);--tblr-indigo-lt: color-mix(in oklab, var(--tblr-indigo) 10%, transparent);--tblr-indigo-200: color-mix(in oklab, var(--tblr-indigo) 20%, transparent);--tblr-indigo-lt-rgb: 236, 239, 253;--tblr-purple: #ae3ec9;--tblr-purple-rgb: 174, 62, 201;--tblr-purple-fg: var(--tblr-light);--tblr-purple-darken: rgb(156.6, 55.8, 180.9);--tblr-purple-darken: color-mix(in oklab, var(--tblr-purple), transparent 20%);--tblr-purple-lt: rgb(246.9, 235.7, 249.6);--tblr-purple-lt: color-mix(in oklab, var(--tblr-purple) 10%, transparent);--tblr-purple-200: color-mix(in oklab, var(--tblr-purple) 20%, transparent);--tblr-purple-lt-rgb: 247, 236, 250;--tblr-pink: #d6336c;--tblr-pink-rgb: 214, 51, 108;--tblr-pink-fg: var(--tblr-light);--tblr-pink-darken: rgb(192.6, 45.9, 97.2);--tblr-pink-darken: color-mix(in oklab, var(--tblr-pink), transparent 20%);--tblr-pink-lt: rgb(250.9, 234.6, 240.3);--tblr-pink-lt: color-mix(in oklab, var(--tblr-pink) 10%, transparent);--tblr-pink-200: color-mix(in oklab, var(--tblr-pink) 20%, transparent);--tblr-pink-lt-rgb: 251, 235, 240;--tblr-red: #d63939;--tblr-red-rgb: 214, 57, 57;--tblr-red-fg: var(--tblr-light);--tblr-red-darken: rgb(192.6, 51.3, 51.3);--tblr-red-darken: color-mix(in oklab, var(--tblr-red), transparent 20%);--tblr-red-lt: rgb(250.9, 235.2, 235.2);--tblr-red-lt: color-mix(in oklab, var(--tblr-red) 10%, transparent);--tblr-red-200: color-mix(in oklab, var(--tblr-red) 20%, transparent);--tblr-red-lt-rgb: 251, 235, 235;--tblr-orange: #f76707;--tblr-orange-rgb: 247, 103, 7;--tblr-orange-fg: var(--tblr-light);--tblr-orange-darken: rgb(222.3, 92.7, 6.3);--tblr-orange-darken: color-mix(in oklab, var(--tblr-orange), transparent 20%);--tblr-orange-lt: rgb(254.2, 239.8, 230.2);--tblr-orange-lt: color-mix(in oklab, var(--tblr-orange) 10%, transparent);--tblr-orange-200: color-mix(in oklab, var(--tblr-orange) 20%, transparent);--tblr-orange-lt-rgb: 254, 240, 230;--tblr-yellow: #f59f00;--tblr-yellow-rgb: 245, 159, 0;--tblr-yellow-fg: var(--tblr-light);--tblr-yellow-darken: rgb(220.5, 143.1, 0);--tblr-yellow-darken: color-mix(in oklab, var(--tblr-yellow), transparent 20%);--tblr-yellow-lt: rgb(254, 245.4, 229.5);--tblr-yellow-lt: color-mix(in oklab, var(--tblr-yellow) 10%, transparent);--tblr-yellow-200: color-mix(in oklab, var(--tblr-yellow) 20%, transparent);--tblr-yellow-lt-rgb: 254, 245, 230;--tblr-lime: #74b816;--tblr-lime-rgb: 116, 184, 22;--tblr-lime-fg: var(--tblr-light);--tblr-lime-darken: rgb(104.4, 165.6, 19.8);--tblr-lime-darken: color-mix(in oklab, var(--tblr-lime), transparent 20%);--tblr-lime-lt: rgb(241.1, 247.9, 231.7);--tblr-lime-lt: color-mix(in oklab, var(--tblr-lime) 10%, transparent);--tblr-lime-200: color-mix(in oklab, var(--tblr-lime) 20%, transparent);--tblr-lime-lt-rgb: 241, 248, 232;--tblr-green: #2fb344;--tblr-green-rgb: 47, 179, 68;--tblr-green-fg: var(--tblr-light);--tblr-green-darken: rgb(42.3, 161.1, 61.2);--tblr-green-darken: color-mix(in oklab, var(--tblr-green), transparent 20%);--tblr-green-lt: rgb(234.2, 247.4, 236.3);--tblr-green-lt: color-mix(in oklab, var(--tblr-green) 10%, transparent);--tblr-green-200: color-mix(in oklab, var(--tblr-green) 20%, transparent);--tblr-green-lt-rgb: 234, 247, 236;--tblr-teal: #0ca678;--tblr-teal-rgb: 12, 166, 120;--tblr-teal-fg: var(--tblr-light);--tblr-teal-darken: rgb(10.8, 149.4, 108);--tblr-teal-darken: color-mix(in oklab, var(--tblr-teal), transparent 20%);--tblr-teal-lt: rgb(230.7, 246.1, 241.5);--tblr-teal-lt: color-mix(in oklab, var(--tblr-teal) 10%, transparent);--tblr-teal-200: color-mix(in oklab, var(--tblr-teal) 20%, transparent);--tblr-teal-lt-rgb: 231, 246, 242;--tblr-cyan: #17a2b8;--tblr-cyan-rgb: 23, 162, 184;--tblr-cyan-fg: var(--tblr-light);--tblr-cyan-darken: rgb(20.7, 145.8, 165.6);--tblr-cyan-darken: color-mix(in oklab, var(--tblr-cyan), transparent 20%);--tblr-cyan-lt: rgb(231.8, 245.7, 247.9);--tblr-cyan-lt: color-mix(in oklab, var(--tblr-cyan) 10%, transparent);--tblr-cyan-200: color-mix(in oklab, var(--tblr-cyan) 20%, transparent);--tblr-cyan-lt-rgb: 232, 246, 248;--tblr-x: #000000;--tblr-x-rgb: 0, 0, 0;--tblr-x-fg: var(--tblr-light);--tblr-x-darken: black;--tblr-x-darken: color-mix(in oklab, var(--tblr-x), transparent 20%);--tblr-x-lt: rgb(229.5, 229.5, 229.5);--tblr-x-lt: color-mix(in oklab, var(--tblr-x) 10%, transparent);--tblr-x-200: color-mix(in oklab, var(--tblr-x) 20%, transparent);--tblr-x-lt-rgb: 230, 230, 230;--tblr-facebook: #1877f2;--tblr-facebook-rgb: 24, 119, 242;--tblr-facebook-fg: var(--tblr-light);--tblr-facebook-darken: rgb(21.6, 107.1, 217.8);--tblr-facebook-darken: color-mix(in oklab, var(--tblr-facebook), transparent 20%);--tblr-facebook-lt: rgb(231.9, 241.4, 253.7);--tblr-facebook-lt: color-mix(in oklab, var(--tblr-facebook) 10%, transparent);--tblr-facebook-200: color-mix(in oklab, var(--tblr-facebook) 20%, transparent);--tblr-facebook-lt-rgb: 232, 241, 254;--tblr-twitter: #1da1f2;--tblr-twitter-rgb: 29, 161, 242;--tblr-twitter-fg: var(--tblr-light);--tblr-twitter-darken: rgb(26.1, 144.9, 217.8);--tblr-twitter-darken: color-mix(in oklab, var(--tblr-twitter), transparent 20%);--tblr-twitter-lt: rgb(232.4, 245.6, 253.7);--tblr-twitter-lt: color-mix(in oklab, var(--tblr-twitter) 10%, transparent);--tblr-twitter-200: color-mix(in oklab, var(--tblr-twitter) 20%, transparent);--tblr-twitter-lt-rgb: 232, 246, 254;--tblr-linkedin: #0a66c2;--tblr-linkedin-rgb: 10, 102, 194;--tblr-linkedin-fg: var(--tblr-light);--tblr-linkedin-darken: rgb(9, 91.8, 174.6);--tblr-linkedin-darken: color-mix(in oklab, var(--tblr-linkedin), transparent 20%);--tblr-linkedin-lt: rgb(230.5, 239.7, 248.9);--tblr-linkedin-lt: color-mix(in oklab, var(--tblr-linkedin) 10%, transparent);--tblr-linkedin-200: color-mix(in oklab, var(--tblr-linkedin) 20%, transparent);--tblr-linkedin-lt-rgb: 231, 240, 249;--tblr-google: #dc4e41;--tblr-google-rgb: 220, 78, 65;--tblr-google-fg: var(--tblr-light);--tblr-google-darken: rgb(198, 70.2, 58.5);--tblr-google-darken: color-mix(in oklab, var(--tblr-google), transparent 20%);--tblr-google-lt: rgb(251.5, 237.3, 236);--tblr-google-lt: color-mix(in oklab, var(--tblr-google) 10%, transparent);--tblr-google-200: color-mix(in oklab, var(--tblr-google) 20%, transparent);--tblr-google-lt-rgb: 252, 237, 236;--tblr-youtube: #ff0000;--tblr-youtube-rgb: 255, 0, 0;--tblr-youtube-fg: var(--tblr-light);--tblr-youtube-darken: rgb(229.5, 0, 0);--tblr-youtube-darken: color-mix(in oklab, var(--tblr-youtube), transparent 20%);--tblr-youtube-lt: rgb(255, 229.5, 229.5);--tblr-youtube-lt: color-mix(in oklab, var(--tblr-youtube) 10%, transparent);--tblr-youtube-200: color-mix(in oklab, var(--tblr-youtube) 20%, transparent);--tblr-youtube-lt-rgb: 255, 230, 230;--tblr-vimeo: #1ab7ea;--tblr-vimeo-rgb: 26, 183, 234;--tblr-vimeo-fg: var(--tblr-light);--tblr-vimeo-darken: rgb(23.4, 164.7, 210.6);--tblr-vimeo-darken: color-mix(in oklab, var(--tblr-vimeo), transparent 20%);--tblr-vimeo-lt: rgb(232.1, 247.8, 252.9);--tblr-vimeo-lt: color-mix(in oklab, var(--tblr-vimeo) 10%, transparent);--tblr-vimeo-200: color-mix(in oklab, var(--tblr-vimeo) 20%, transparent);--tblr-vimeo-lt-rgb: 232, 248, 253;--tblr-dribbble: #ea4c89;--tblr-dribbble-rgb: 234, 76, 137;--tblr-dribbble-fg: var(--tblr-light);--tblr-dribbble-darken: rgb(210.6, 68.4, 123.3);--tblr-dribbble-darken: color-mix(in oklab, var(--tblr-dribbble), transparent 20%);--tblr-dribbble-lt: rgb(252.9, 237.1, 243.2);--tblr-dribbble-lt: color-mix(in oklab, var(--tblr-dribbble) 10%, transparent);--tblr-dribbble-200: color-mix(in oklab, var(--tblr-dribbble) 20%, transparent);--tblr-dribbble-lt-rgb: 253, 237, 243;--tblr-github: #181717;--tblr-github-rgb: 24, 23, 23;--tblr-github-fg: var(--tblr-light);--tblr-github-darken: rgb(21.6, 20.7, 20.7);--tblr-github-darken: color-mix(in oklab, var(--tblr-github), transparent 20%);--tblr-github-lt: rgb(231.9, 231.8, 231.8);--tblr-github-lt: color-mix(in oklab, var(--tblr-github) 10%, transparent);--tblr-github-200: color-mix(in oklab, var(--tblr-github) 20%, transparent);--tblr-github-lt-rgb: 232, 232, 232;--tblr-instagram: #e4405f;--tblr-instagram-rgb: 228, 64, 95;--tblr-instagram-fg: var(--tblr-light);--tblr-instagram-darken: rgb(205.2, 57.6, 85.5);--tblr-instagram-darken: color-mix(in oklab, var(--tblr-instagram), transparent 20%);--tblr-instagram-lt: rgb(252.3, 235.9, 239);--tblr-instagram-lt: color-mix(in oklab, var(--tblr-instagram) 10%, transparent);--tblr-instagram-200: color-mix(in oklab, var(--tblr-instagram) 20%, transparent);--tblr-instagram-lt-rgb: 252, 236, 239;--tblr-pinterest: #bd081c;--tblr-pinterest-rgb: 189, 8, 28;--tblr-pinterest-fg: var(--tblr-light);--tblr-pinterest-darken: rgb(170.1, 7.2, 25.2);--tblr-pinterest-darken: color-mix(in oklab, var(--tblr-pinterest), transparent 20%);--tblr-pinterest-lt: rgb(248.4, 230.3, 232.3);--tblr-pinterest-lt: color-mix(in oklab, var(--tblr-pinterest) 10%, transparent);--tblr-pinterest-200: color-mix(in oklab, var(--tblr-pinterest) 20%, transparent);--tblr-pinterest-lt-rgb: 248, 230, 232;--tblr-vk: #6383a8;--tblr-vk-rgb: 99, 131, 168;--tblr-vk-fg: var(--tblr-light);--tblr-vk-darken: rgb(89.1, 117.9, 151.2);--tblr-vk-darken: color-mix(in oklab, var(--tblr-vk), transparent 20%);--tblr-vk-lt: rgb(239.4, 242.6, 246.3);--tblr-vk-lt: color-mix(in oklab, var(--tblr-vk) 10%, transparent);--tblr-vk-200: color-mix(in oklab, var(--tblr-vk) 20%, transparent);--tblr-vk-lt-rgb: 239, 243, 246;--tblr-rss: #ffa500;--tblr-rss-rgb: 255, 165, 0;--tblr-rss-fg: var(--tblr-light);--tblr-rss-darken: rgb(229.5, 148.5, 0);--tblr-rss-darken: color-mix(in oklab, var(--tblr-rss), transparent 20%);--tblr-rss-lt: rgb(255, 246, 229.5);--tblr-rss-lt: color-mix(in oklab, var(--tblr-rss) 10%, transparent);--tblr-rss-200: color-mix(in oklab, var(--tblr-rss) 20%, transparent);--tblr-rss-lt-rgb: 255, 246, 230;--tblr-flickr: #0063dc;--tblr-flickr-rgb: 0, 99, 220;--tblr-flickr-fg: var(--tblr-light);--tblr-flickr-darken: rgb(0, 89.1, 198);--tblr-flickr-darken: color-mix(in oklab, var(--tblr-flickr), transparent 20%);--tblr-flickr-lt: rgb(229.5, 239.4, 251.5);--tblr-flickr-lt: color-mix(in oklab, var(--tblr-flickr) 10%, transparent);--tblr-flickr-200: color-mix(in oklab, var(--tblr-flickr) 20%, transparent);--tblr-flickr-lt-rgb: 230, 239, 252;--tblr-bitbucket: #0052cc;--tblr-bitbucket-rgb: 0, 82, 204;--tblr-bitbucket-fg: var(--tblr-light);--tblr-bitbucket-darken: rgb(0, 73.8, 183.6);--tblr-bitbucket-darken: color-mix(in oklab, var(--tblr-bitbucket), transparent 20%);--tblr-bitbucket-lt: rgb(229.5, 237.7, 249.9);--tblr-bitbucket-lt: color-mix(in oklab, var(--tblr-bitbucket) 10%, transparent);--tblr-bitbucket-200: color-mix(in oklab, var(--tblr-bitbucket) 20%, transparent);--tblr-bitbucket-lt-rgb: 230, 238, 250;--tblr-tabler: #066fd1;--tblr-tabler-rgb: 6, 111, 209;--tblr-tabler-fg: var(--tblr-light);--tblr-tabler-darken: rgb(5.4, 99.9, 188.1);--tblr-tabler-darken: color-mix(in oklab, var(--tblr-tabler), transparent 20%);--tblr-tabler-lt: rgb(230.1, 240.6, 250.4);--tblr-tabler-lt: color-mix(in oklab, var(--tblr-tabler) 10%, transparent);--tblr-tabler-200: color-mix(in oklab, var(--tblr-tabler) 20%, transparent);--tblr-tabler-lt-rgb: 230, 241, 250;--tblr-gray-50-fg: var(--tblr-body-color);--tblr-gray-100-fg: var(--tblr-body-color);--tblr-gray-200-fg: var(--tblr-body-color);--tblr-gray-300-fg: var(--tblr-body-color);--tblr-gray-400-fg: var(--tblr-white);--tblr-gray-500-fg: var(--tblr-white);--tblr-gray-600-fg: var(--tblr-white);--tblr-gray-700-fg: var(--tblr-white);--tblr-gray-800-fg: var(--tblr-white);--tblr-gray-900-fg: var(--tblr-white);--tblr-gray-950-fg: var(--tblr-white);--tblr-spacer-0: 0;--tblr-spacer-1: .25rem;--tblr-spacer-2: .5rem;--tblr-spacer-3: 1rem;--tblr-spacer-4: 1.5rem;--tblr-spacer-5: 2rem;--tblr-spacer-6: 2.5rem;--tblr-font-weight-light: 300;--tblr-font-weight-normal: 400;--tblr-font-weight-medium: 500;--tblr-font-weight-bold: 600;--tblr-font-weight-black: 700;--tblr-font-weight-headings: var(--tblr-font-weight-bold);--tblr-font-size-h1: 1.5rem;--tblr-font-size-h2: 1.25rem;--tblr-font-size-h3: 1rem;--tblr-font-size-h4: .875rem;--tblr-font-size-h5: .75rem;--tblr-font-size-h6: .625rem;--tblr-line-height-h1: 2rem;--tblr-line-height-h2: 1.75rem;--tblr-line-height-h3: 1.5rem;--tblr-line-height-h4: 1.25rem;--tblr-line-height-h5: 1rem;--tblr-line-height-h6: 1rem;--tblr-shadow: rgba(var(--tblr-body-color-rgb), .04) 0 2px 4px 0;--tblr-shadow-border: inset 0 0 0 1px var(--tblr-border-color-translucent);--tblr-shadow-transparent: 0 0 0 0 transparent;--tblr-shadow-input: 0 1px 1px rgba(var(--tblr-body-color-rgb), .06);--tblr-shadow-card: 0 0 4px rgba(var(--tblr-body-color-rgb), .04);--tblr-shadow-card-hover: rgba(var(--tblr-body-color-rgb), .16) 0 2px 16px 0;--tblr-shadow-dropdown: 0 16px 24px 2px rgba(0, 0, 0, .07), 0 6px 30px 5px rgba(0, 0, 0, .06), 0 8px 10px -5px rgba(0, 0, 0, .1);--tblr-border-radius-scale: 1;--tblr-border-radius-0: calc(0 * var(--tblr-border-radius-scale, 1));--tblr-border-radius-sm: calc(4px * var(--tblr-border-radius-scale, 1));--tblr-border-radius-md: calc(6px * var(--tblr-border-radius-scale, 1));--tblr-border-radius-lg: calc(8px * var(--tblr-border-radius-scale, 1));--tblr-border-radius-pill: calc(100rem * var(--tblr-border-radius-scale, 1));--tblr-border-radius: var(--tblr-border-radius-md);--tblr-backdrop-opacity: 24%;--tblr-backdrop-bg: var(--tblr-bg-surface-dark);--tblr-backdrop-bg-dark: color-mix(in srgb, var(--tblr-color-dark), transparent var(--tblr-backdrop-opacity));--tblr-backdrop-bg-light: color-mix(in srgb, var(--tblr-color-light), transparent var(--tblr-backdrop-opacity));--tblr-backdrop-blur: 4px;--tblr-backdrop-filter: blur(var(--tblr-backdrop-blur))}:root,:host{font-size:16px;height:100%}@media(min-width:992px){:root,:host{margin-left:calc(100vw - 100%);margin-right:0}}:root,:host,[data-bs-theme=light]{color-scheme:light;--tblr-spacer: var(--tblr-spacer-2);--tblr-bg-surface: var(--tblr-bg-surface-primary);--tblr-bg-surface-primary: var(--tblr-white);--tblr-bg-surface-secondary: var(--tblr-gray-50);--tblr-bg-surface-tertiary: var(--tblr-gray-50);--tblr-bg-surface-dark: var(--tblr-gray-900);--tblr-bg-surface-inverted: var(--tblr-gray-900);--tblr-bg-forms: var(--tblr-bg-surface);--tblr-text-inverted: var(--tblr-gray-100);--tblr-body-color: var(--tblr-gray-700);--tblr-body-bg: var(--tblr-bg-surface-secondary);--tblr-link-color: var(--tblr-primary);--tblr-link-hover-color: color-mix(in srgb, var(--tblr-primary), #000 20%);--tblr-secondary: var(--tblr-gray-500);--tblr-tertiary: var(--tblr-gray-400);--tblr-border-color: #e5e7eb;--tblr-border-color-translucent: rgba(4, 32, 69, .1);--tblr-border-dark-color: #9ca3af;--tblr-border-dark-color-translucent: rgba(4, 32, 69, .27);--tblr-border-active-color: rgb(169.16, 173.22, 181.34);--tblr-icon-color: var(--tblr-gray-400);--tblr-active-bg: rgba(var(--tblr-primary-rgb), .04);--tblr-disabled-bg: var(--tblr-bg-surface-secondary);--tblr-disabled-color: color-mix(in srgb, var(--tblr-body-color) 40%, transparent);--tblr-code-color: light-dark(var(--tblr-gray-600), var(--tblr-gray-400));--tblr-code-bg: light-dark(var(--tblr-gray-100), var(--tblr-gray-900));--tblr-dark-mode-border-color: rgb(45.7069767442, 60.4511627907, 81.0930232558);--tblr-dark-mode-border-color-translucent: rgba(72, 110, 149, .14);--tblr-dark-mode-border-active-color: rgb(53.0604651163, 70.176744186, 94.1395348837);--tblr-dark-mode-border-dark-color: rgb(38.3534883721, 50.7255813953, 68.0465116279);--tblr-page-padding: var(--tblr-spacer-3);--tblr-page-padding-y: var(--tblr-spacer-4)}@media(max-width:991.98px){:root,:host,[data-bs-theme=light]{--tblr-page-padding: var(--tblr-spacer-2)}}@keyframes pulse{0%{transform:scale(1)}14%{transform:scale(1.25)}28%{transform:scale(1)}42%{transform:scale(1.25)}70%{transform:scale(1)}}@keyframes tada{0%{transform:scaleZ(1)}10%,5%{transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-5deg)}15%,25%,35%,45%{transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,5deg)}20%,30%,40%{transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-5deg)}50%{transform:scaleZ(1)}}@keyframes rotate-360{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes blink{0%{opacity:0}50%{opacity:1}to{opacity:0}}@keyframes shake{0%{transform:scaleX(1)}20%{transform:scale3d(.9,.9,.9) rotate(-5deg)}50%,70%,90%{transform:scale3d(1.25,1.25,1.25) rotate(5deg)}60%,80%{transform:scale3d(1.25,1.25,1.25) rotate(-5deg)}to{transform:scaleX(1)}}body{letter-spacing:0;touch-action:manipulation;text-rendering:optimizeLegibility;font-feature-settings:"liga" 0,"cv03","cv04","cv11";position:relative;min-height:100%;height:100%;padding:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media print{body{background:transparent}}*{scrollbar-color:color-mix(in srgb,var(--tblr-scrollbar-color, var(--tblr-body-color)) 20%,transparent) transparent}*::-webkit-scrollbar{width:1rem;height:1rem;transition:background .3s}@media(prefers-reduced-motion:reduce){*::-webkit-scrollbar{transition:none}}*::-webkit-scrollbar-thumb{border-radius:1rem;border:5px solid transparent;box-shadow:inset 0 0 0 1rem color-mix(in srgb,var(--tblr-scrollbar-color, var(--tblr-body-color)) 20%,transparent)}*::-webkit-scrollbar-track{background:transparent}*:hover::-webkit-scrollbar-thumb{box-shadow:inset 0 0 0 1rem color-mix(in srgb,var(--tblr-scrollbar-color, var(--tblr-body-color)) 40%,transparent)}*::-webkit-scrollbar-corner{background:transparent}.layout-fluid .container,.layout-fluid [class^=container-],.layout-fluid [class*=" container-"]{max-width:100%}.layout-boxed{--tblr-theme-boxed-border-radius: 0;--tblr-theme-boxed-width: 1320px}@media(min-width:768px){.layout-boxed{background:#1f2937 linear-gradient(to right,rgba(255,255,255,.1),transparent) fixed;padding:1rem;--tblr-theme-boxed-border-radius: 6px}}.layout-boxed .page{margin:0 auto;max-width:var(--tblr-theme-boxed-width);border-radius:var(--tblr-theme-boxed-border-radius);color:var(--tblr-body-color)}@media(min-width:768px){.layout-boxed .page{border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);background:var(--tblr-body-bg)}}.layout-boxed .page>.navbar:first-child{border-top-left-radius:var(--tblr-theme-boxed-border-radius);border-top-right-radius:var(--tblr-theme-boxed-border-radius)}.navbar{--tblr-navbar-bg: var(--tblr-bg-surface);--tblr-navbar-border-width: var(--tblr-border-width);--tblr-navbar-active-border-color: #00857D;--tblr-navbar-active-bg: rgba(0, 0, 0, .2);--tblr-navbar-border-color: var(--tblr-border-color);--tblr-navbar-hover-color: var(--tblr-body-color);align-items:stretch;min-height:3.5rem;box-shadow:inset 0 calc(-1 * var(--tblr-navbar-border-width)) 0 0 var(--tblr-navbar-border-color);background:var(--tblr-navbar-bg);color:var(--tblr-navbar-color)}.navbar-collapse .navbar{flex-grow:1}.navbar.collapsing{min-height:0}.navbar .dropdown-menu{position:absolute;z-index:1030}.navbar .navbar-nav{min-height:3rem}.navbar .navbar-nav .nav-link{position:relative;min-width:2.5rem;min-height:2.5rem;justify-content:center;border-radius:var(--tblr-border-radius)}.navbar .navbar-nav .nav-link .badge{position:absolute;top:.375rem;right:.375rem;transform:translate(50%,-50%)}@media(max-width:575.98px){.navbar-expand-sm .navbar-collapse{flex-direction:column}.navbar-expand-sm .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-expand-sm .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-expand-sm .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-expand-sm .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-expand-sm .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-item.disabled{color:var(--tblr-disabled-color);pointer-events:none;background-color:transparent}.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-expand-sm .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-expand-sm .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media(min-width:576px){.navbar-expand-sm .navbar-collapse{width:auto;flex:1 1 auto}.navbar-expand-sm .nav-item.active{position:relative}.navbar-expand-sm .nav-item.active .nav-link{color:var(--tblr-navbar-active-color)}.navbar-expand-sm .nav-item.active:after{content:"";position:absolute;left:0;right:0;bottom:-.25rem;border:0 var(--tblr-border-style) var(--tblr-navbar-active-border-color);border-bottom-width:2px}.navbar-expand-sm.navbar-vertical{box-shadow:inset calc(-1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-sm.navbar-vertical.navbar-right,.navbar-expand-sm.navbar-vertical.navbar-end{box-shadow:inset calc(1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-sm.navbar-vertical~.navbar,.navbar-expand-sm.navbar-vertical~.page-wrapper{margin-left:18rem}.navbar-expand-sm.navbar-vertical.navbar-right~.navbar,.navbar-expand-sm.navbar-vertical.navbar-right~.page-wrapper,.navbar-expand-sm.navbar-vertical.navbar-end~.navbar,.navbar-expand-sm.navbar-vertical.navbar-end~.page-wrapper{margin-left:0;margin-right:18rem}}@media(max-width:767.98px){.navbar-expand-md .navbar-collapse{flex-direction:column}.navbar-expand-md .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-expand-md .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-expand-md .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-expand-md .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-expand-md .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-item.disabled{color:var(--tblr-disabled-color);pointer-events:none;background-color:transparent}.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-expand-md .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-expand-md .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media(min-width:768px){.navbar-expand-md .navbar-collapse{width:auto;flex:1 1 auto}.navbar-expand-md .nav-item.active{position:relative}.navbar-expand-md .nav-item.active .nav-link{color:var(--tblr-navbar-active-color)}.navbar-expand-md .nav-item.active:after{content:"";position:absolute;left:0;right:0;bottom:-.25rem;border:0 var(--tblr-border-style) var(--tblr-navbar-active-border-color);border-bottom-width:2px}.navbar-expand-md.navbar-vertical{box-shadow:inset calc(-1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-md.navbar-vertical.navbar-right,.navbar-expand-md.navbar-vertical.navbar-end{box-shadow:inset calc(1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-md.navbar-vertical~.navbar,.navbar-expand-md.navbar-vertical~.page-wrapper{margin-left:18rem}.navbar-expand-md.navbar-vertical.navbar-right~.navbar,.navbar-expand-md.navbar-vertical.navbar-right~.page-wrapper,.navbar-expand-md.navbar-vertical.navbar-end~.navbar,.navbar-expand-md.navbar-vertical.navbar-end~.page-wrapper{margin-left:0;margin-right:18rem}}@media(max-width:991.98px){.navbar-expand-lg .navbar-collapse{flex-direction:column}.navbar-expand-lg .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-expand-lg .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-expand-lg .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-expand-lg .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-expand-lg .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item.disabled{color:var(--tblr-disabled-color);pointer-events:none;background-color:transparent}.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-expand-lg .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-expand-lg .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media(min-width:992px){.navbar-expand-lg .navbar-collapse{width:auto;flex:1 1 auto}.navbar-expand-lg .nav-item.active{position:relative}.navbar-expand-lg .nav-item.active .nav-link{color:var(--tblr-navbar-active-color)}.navbar-expand-lg .nav-item.active:after{content:"";position:absolute;left:0;right:0;bottom:-.25rem;border:0 var(--tblr-border-style) var(--tblr-navbar-active-border-color);border-bottom-width:2px}.navbar-expand-lg.navbar-vertical{box-shadow:inset calc(-1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-lg.navbar-vertical.navbar-right,.navbar-expand-lg.navbar-vertical.navbar-end{box-shadow:inset calc(1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-lg.navbar-vertical~.navbar,.navbar-expand-lg.navbar-vertical~.page-wrapper{margin-left:18rem}.navbar-expand-lg.navbar-vertical.navbar-right~.navbar,.navbar-expand-lg.navbar-vertical.navbar-right~.page-wrapper,.navbar-expand-lg.navbar-vertical.navbar-end~.navbar,.navbar-expand-lg.navbar-vertical.navbar-end~.page-wrapper{margin-left:0;margin-right:18rem}}@media(max-width:1199.98px){.navbar-expand-xl .navbar-collapse{flex-direction:column}.navbar-expand-xl .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-expand-xl .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-expand-xl .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-expand-xl .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-expand-xl .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-item.disabled{color:var(--tblr-disabled-color);pointer-events:none;background-color:transparent}.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-expand-xl .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-expand-xl .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media(min-width:1200px){.navbar-expand-xl .navbar-collapse{width:auto;flex:1 1 auto}.navbar-expand-xl .nav-item.active{position:relative}.navbar-expand-xl .nav-item.active .nav-link{color:var(--tblr-navbar-active-color)}.navbar-expand-xl .nav-item.active:after{content:"";position:absolute;left:0;right:0;bottom:-.25rem;border:0 var(--tblr-border-style) var(--tblr-navbar-active-border-color);border-bottom-width:2px}.navbar-expand-xl.navbar-vertical{box-shadow:inset calc(-1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-xl.navbar-vertical.navbar-right,.navbar-expand-xl.navbar-vertical.navbar-end{box-shadow:inset calc(1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-xl.navbar-vertical~.navbar,.navbar-expand-xl.navbar-vertical~.page-wrapper{margin-left:18rem}.navbar-expand-xl.navbar-vertical.navbar-right~.navbar,.navbar-expand-xl.navbar-vertical.navbar-right~.page-wrapper,.navbar-expand-xl.navbar-vertical.navbar-end~.navbar,.navbar-expand-xl.navbar-vertical.navbar-end~.page-wrapper{margin-left:0;margin-right:18rem}}@media(max-width:1399.98px){.navbar-expand-xxl .navbar-collapse{flex-direction:column}.navbar-expand-xxl .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-expand-xxl .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-expand-xxl .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-expand-xxl .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-expand-xxl .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-item.disabled{color:var(--tblr-disabled-color);pointer-events:none;background-color:transparent}.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-expand-xxl .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-expand-xxl .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media(min-width:1400px){.navbar-expand-xxl .navbar-collapse{width:auto;flex:1 1 auto}.navbar-expand-xxl .nav-item.active{position:relative}.navbar-expand-xxl .nav-item.active .nav-link{color:var(--tblr-navbar-active-color)}.navbar-expand-xxl .nav-item.active:after{content:"";position:absolute;left:0;right:0;bottom:-.25rem;border:0 var(--tblr-border-style) var(--tblr-navbar-active-border-color);border-bottom-width:2px}.navbar-expand-xxl.navbar-vertical{box-shadow:inset calc(-1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-xxl.navbar-vertical.navbar-right,.navbar-expand-xxl.navbar-vertical.navbar-end{box-shadow:inset calc(1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-xxl.navbar-vertical~.navbar,.navbar-expand-xxl.navbar-vertical~.page-wrapper{margin-left:18rem}.navbar-expand-xxl.navbar-vertical.navbar-right~.navbar,.navbar-expand-xxl.navbar-vertical.navbar-right~.page-wrapper,.navbar-expand-xxl.navbar-vertical.navbar-end~.navbar,.navbar-expand-xxl.navbar-vertical.navbar-end~.page-wrapper{margin-left:0;margin-right:18rem}}.navbar-expand .navbar-collapse{flex-direction:column}.navbar-expand .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-expand .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-expand .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-expand .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-expand .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-expand .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-expand .navbar-collapse .dropdown-menu .dropdown-item.disabled{color:var(--tblr-disabled-color);pointer-events:none;background-color:transparent}.navbar-expand .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-expand .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-expand .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-expand .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-expand .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-expand .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}.navbar-expand .navbar-collapse{width:auto;flex:1 1 auto}.navbar-expand .nav-item.active{position:relative}.navbar-expand .nav-item.active .nav-link{color:var(--tblr-navbar-active-color)}.navbar-expand .nav-item.active:after{content:"";position:absolute;left:0;right:0;bottom:-.25rem;border:0 var(--tblr-border-style) var(--tblr-navbar-active-border-color);border-bottom-width:2px}.navbar-expand.navbar-vertical{box-shadow:inset calc(-1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand.navbar-vertical.navbar-right,.navbar-expand.navbar-vertical.navbar-end{box-shadow:inset calc(1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand.navbar-vertical~.navbar,.navbar-expand.navbar-vertical~.page-wrapper{margin-left:18rem}.navbar-expand.navbar-vertical.navbar-right~.navbar,.navbar-expand.navbar-vertical.navbar-right~.page-wrapper,.navbar-expand.navbar-vertical.navbar-end~.navbar,.navbar-expand.navbar-vertical.navbar-end~.page-wrapper{margin-left:0;margin-right:18rem}.navbar-brand{display:inline-flex;align-items:center;font-weight:var(--tblr-font-weight-bold);margin:0;line-height:1;gap:.5rem}.navbar-brand-image{height:2rem;width:auto}.navbar-toggler{border:0;width:2rem;height:2rem;position:relative;display:flex;align-items:center;justify-content:center}.navbar-toggler-icon{height:2px;width:1.25em;background:currentColor;border-radius:10px;transition:top .2s .2s,bottom .2s .2s,transform .2s,opacity 0s .2s}@media(prefers-reduced-motion:reduce){.navbar-toggler-icon{transition:none}}.navbar-toggler-icon{position:relative}.navbar-toggler-icon:before,.navbar-toggler-icon:after{content:"";display:block;height:inherit;width:inherit;border-radius:inherit;background:inherit;position:absolute;left:0;transition:inherit}@media(prefers-reduced-motion:reduce){.navbar-toggler-icon:before,.navbar-toggler-icon:after{transition:none}}.navbar-toggler-icon:before{top:-.45em}.navbar-toggler-icon:after{bottom:-.45em}.navbar-toggler[aria-expanded=true] .navbar-toggler-icon{transform:rotate(45deg);transition:top .3s,bottom .3s,transform .3s .3s,opacity 0s .3s}@media(prefers-reduced-motion:reduce){.navbar-toggler[aria-expanded=true] .navbar-toggler-icon{transition:none}}.navbar-toggler[aria-expanded=true] .navbar-toggler-icon:before{top:0;transform:rotate(-90deg)}.navbar-toggler[aria-expanded=true] .navbar-toggler-icon:after{bottom:0;opacity:0}.navbar-transparent{--tblr-navbar-border-color: transparent !important;background:transparent!important}.navbar-nav{--tblr-nav-link-hover-bg: color-mix(in srgb, var(--tblr-nav-link-color) 4%, transparent);margin:0;padding:0;align-items:stretch}.navbar-nav .nav-item{display:flex;flex-direction:column;justify-content:center}.navbar-side{margin:0;display:flex;flex-direction:row;align-items:center;justify-content:space-around}@media(min-width:576px){.navbar-vertical.navbar-expand-sm{width:18rem;position:fixed;top:0;left:0;bottom:0;z-index:1030;align-items:flex-start;transition:transform .3s;overflow-y:scroll;padding:0}}@media(min-width:576px)and (prefers-reduced-motion:reduce){.navbar-vertical.navbar-expand-sm{transition:none}}@media(min-width:576px){.navbar-vertical.navbar-expand-sm.navbar-right,.navbar-vertical.navbar-expand-sm.navbar-end{left:auto;right:0}.navbar-vertical.navbar-expand-sm .navbar-brand{padding:.75rem 0;justify-content:center}.navbar-vertical.navbar-expand-sm .navbar-collapse{align-items:stretch}.navbar-vertical.navbar-expand-sm .navbar-nav{flex-direction:column;flex-grow:1;min-height:auto}.navbar-vertical.navbar-expand-sm .navbar-nav .nav-link{padding-top:.5rem;padding-bottom:.5rem}.navbar-vertical.navbar-expand-sm>[class^=container]{flex-direction:column;align-items:stretch;min-height:100%;justify-content:flex-start;padding:0}.navbar-vertical.navbar-expand-sm~.page{padding-left:18rem}.navbar-vertical.navbar-expand-sm~.page [class^=container]{padding-left:1.5rem;padding-right:1.5rem}.navbar-vertical.navbar-expand-sm.navbar-right~.page,.navbar-vertical.navbar-expand-sm.navbar-end~.page{padding-left:0;padding-right:18rem}.navbar-vertical.navbar-expand-sm .navbar-collapse{flex-direction:column}.navbar-vertical.navbar-expand-sm .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-vertical.navbar-expand-sm .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-vertical.navbar-expand-sm .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-item.disabled{color:var(--tblr-disabled-color);pointer-events:none;background-color:transparent}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-vertical.navbar-expand-sm .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media(min-width:768px){.navbar-vertical.navbar-expand-md{width:18rem;position:fixed;top:0;left:0;bottom:0;z-index:1030;align-items:flex-start;transition:transform .3s;overflow-y:scroll;padding:0}}@media(min-width:768px)and (prefers-reduced-motion:reduce){.navbar-vertical.navbar-expand-md{transition:none}}@media(min-width:768px){.navbar-vertical.navbar-expand-md.navbar-right,.navbar-vertical.navbar-expand-md.navbar-end{left:auto;right:0}.navbar-vertical.navbar-expand-md .navbar-brand{padding:.75rem 0;justify-content:center}.navbar-vertical.navbar-expand-md .navbar-collapse{align-items:stretch}.navbar-vertical.navbar-expand-md .navbar-nav{flex-direction:column;flex-grow:1;min-height:auto}.navbar-vertical.navbar-expand-md .navbar-nav .nav-link{padding-top:.5rem;padding-bottom:.5rem}.navbar-vertical.navbar-expand-md>[class^=container]{flex-direction:column;align-items:stretch;min-height:100%;justify-content:flex-start;padding:0}.navbar-vertical.navbar-expand-md~.page{padding-left:18rem}.navbar-vertical.navbar-expand-md~.page [class^=container]{padding-left:1.5rem;padding-right:1.5rem}.navbar-vertical.navbar-expand-md.navbar-right~.page,.navbar-vertical.navbar-expand-md.navbar-end~.page{padding-left:0;padding-right:18rem}.navbar-vertical.navbar-expand-md .navbar-collapse{flex-direction:column}.navbar-vertical.navbar-expand-md .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-vertical.navbar-expand-md .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-vertical.navbar-expand-md .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-item.disabled{color:var(--tblr-disabled-color);pointer-events:none;background-color:transparent}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-vertical.navbar-expand-md .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media(min-width:992px){.navbar-vertical.navbar-expand-lg{width:18rem;position:fixed;top:0;left:0;bottom:0;z-index:1030;align-items:flex-start;transition:transform .3s;overflow-y:scroll;padding:0}}@media(min-width:992px)and (prefers-reduced-motion:reduce){.navbar-vertical.navbar-expand-lg{transition:none}}@media(min-width:992px){.navbar-vertical.navbar-expand-lg.navbar-right,.navbar-vertical.navbar-expand-lg.navbar-end{left:auto;right:0}.navbar-vertical.navbar-expand-lg .navbar-brand{padding:.75rem 0;justify-content:center}.navbar-vertical.navbar-expand-lg .navbar-collapse{align-items:stretch}.navbar-vertical.navbar-expand-lg .navbar-nav{flex-direction:column;flex-grow:1;min-height:auto}.navbar-vertical.navbar-expand-lg .navbar-nav .nav-link{padding-top:.5rem;padding-bottom:.5rem}.navbar-vertical.navbar-expand-lg>[class^=container]{flex-direction:column;align-items:stretch;min-height:100%;justify-content:flex-start;padding:0}.navbar-vertical.navbar-expand-lg~.page{padding-left:18rem}.navbar-vertical.navbar-expand-lg~.page [class^=container]{padding-left:1.5rem;padding-right:1.5rem}.navbar-vertical.navbar-expand-lg.navbar-right~.page,.navbar-vertical.navbar-expand-lg.navbar-end~.page{padding-left:0;padding-right:18rem}.navbar-vertical.navbar-expand-lg .navbar-collapse{flex-direction:column}.navbar-vertical.navbar-expand-lg .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-vertical.navbar-expand-lg .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-vertical.navbar-expand-lg .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item.disabled{color:var(--tblr-disabled-color);pointer-events:none;background-color:transparent}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-vertical.navbar-expand-lg .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media(min-width:1200px){.navbar-vertical.navbar-expand-xl{width:18rem;position:fixed;top:0;left:0;bottom:0;z-index:1030;align-items:flex-start;transition:transform .3s;overflow-y:scroll;padding:0}}@media(min-width:1200px)and (prefers-reduced-motion:reduce){.navbar-vertical.navbar-expand-xl{transition:none}}@media(min-width:1200px){.navbar-vertical.navbar-expand-xl.navbar-right,.navbar-vertical.navbar-expand-xl.navbar-end{left:auto;right:0}.navbar-vertical.navbar-expand-xl .navbar-brand{padding:.75rem 0;justify-content:center}.navbar-vertical.navbar-expand-xl .navbar-collapse{align-items:stretch}.navbar-vertical.navbar-expand-xl .navbar-nav{flex-direction:column;flex-grow:1;min-height:auto}.navbar-vertical.navbar-expand-xl .navbar-nav .nav-link{padding-top:.5rem;padding-bottom:.5rem}.navbar-vertical.navbar-expand-xl>[class^=container]{flex-direction:column;align-items:stretch;min-height:100%;justify-content:flex-start;padding:0}.navbar-vertical.navbar-expand-xl~.page{padding-left:18rem}.navbar-vertical.navbar-expand-xl~.page [class^=container]{padding-left:1.5rem;padding-right:1.5rem}.navbar-vertical.navbar-expand-xl.navbar-right~.page,.navbar-vertical.navbar-expand-xl.navbar-end~.page{padding-left:0;padding-right:18rem}.navbar-vertical.navbar-expand-xl .navbar-collapse{flex-direction:column}.navbar-vertical.navbar-expand-xl .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-vertical.navbar-expand-xl .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-vertical.navbar-expand-xl .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-item.disabled{color:var(--tblr-disabled-color);pointer-events:none;background-color:transparent}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-vertical.navbar-expand-xl .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media(min-width:1400px){.navbar-vertical.navbar-expand-xxl{width:18rem;position:fixed;top:0;left:0;bottom:0;z-index:1030;align-items:flex-start;transition:transform .3s;overflow-y:scroll;padding:0}}@media(min-width:1400px)and (prefers-reduced-motion:reduce){.navbar-vertical.navbar-expand-xxl{transition:none}}@media(min-width:1400px){.navbar-vertical.navbar-expand-xxl.navbar-right,.navbar-vertical.navbar-expand-xxl.navbar-end{left:auto;right:0}.navbar-vertical.navbar-expand-xxl .navbar-brand{padding:.75rem 0;justify-content:center}.navbar-vertical.navbar-expand-xxl .navbar-collapse{align-items:stretch}.navbar-vertical.navbar-expand-xxl .navbar-nav{flex-direction:column;flex-grow:1;min-height:auto}.navbar-vertical.navbar-expand-xxl .navbar-nav .nav-link{padding-top:.5rem;padding-bottom:.5rem}.navbar-vertical.navbar-expand-xxl>[class^=container]{flex-direction:column;align-items:stretch;min-height:100%;justify-content:flex-start;padding:0}.navbar-vertical.navbar-expand-xxl~.page{padding-left:18rem}.navbar-vertical.navbar-expand-xxl~.page [class^=container]{padding-left:1.5rem;padding-right:1.5rem}.navbar-vertical.navbar-expand-xxl.navbar-right~.page,.navbar-vertical.navbar-expand-xxl.navbar-end~.page{padding-left:0;padding-right:18rem}.navbar-vertical.navbar-expand-xxl .navbar-collapse{flex-direction:column}.navbar-vertical.navbar-expand-xxl .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-vertical.navbar-expand-xxl .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-vertical.navbar-expand-xxl .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-item.disabled{color:var(--tblr-disabled-color);pointer-events:none;background-color:transparent}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-vertical.navbar-expand-xxl .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}.navbar-vertical.navbar-expand{width:18rem;position:fixed;top:0;left:0;bottom:0;z-index:1030;align-items:flex-start;transition:transform .3s}@media(prefers-reduced-motion:reduce){.navbar-vertical.navbar-expand{transition:none}}.navbar-vertical.navbar-expand{overflow-y:scroll;padding:0}.navbar-vertical.navbar-expand.navbar-right,.navbar-vertical.navbar-expand.navbar-end{left:auto;right:0}.navbar-vertical.navbar-expand .navbar-brand{padding:.75rem 0;justify-content:center}.navbar-vertical.navbar-expand .navbar-collapse{align-items:stretch}.navbar-vertical.navbar-expand .navbar-nav{flex-direction:column;flex-grow:1;min-height:auto}.navbar-vertical.navbar-expand .navbar-nav .nav-link{padding-top:.5rem;padding-bottom:.5rem}.navbar-vertical.navbar-expand>[class^=container]{flex-direction:column;align-items:stretch;min-height:100%;justify-content:flex-start;padding:0}.navbar-vertical.navbar-expand~.page{padding-left:18rem}.navbar-vertical.navbar-expand~.page [class^=container]{padding-left:1.5rem;padding-right:1.5rem}.navbar-vertical.navbar-expand.navbar-right~.page,.navbar-vertical.navbar-expand.navbar-end~.page{padding-left:0;padding-right:18rem}.navbar-vertical.navbar-expand .navbar-collapse{flex-direction:column}.navbar-vertical.navbar-expand .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-vertical.navbar-expand .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-vertical.navbar-expand .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu .dropdown-item.disabled{color:var(--tblr-disabled-color);pointer-events:none;background-color:transparent}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-vertical.navbar-expand .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}.navbar-overlap:after{content:"";height:9rem;position:absolute;top:100%;left:0;right:0;background:inherit;z-index:-1;box-shadow:inherit}.page{display:flex;flex-direction:column;position:relative;min-height:100%}.page-center{justify-content:center}.page-wrapper{flex:1;display:flex;flex-direction:column}@media print{.page-wrapper{margin:0!important}}.page-wrapper-full .page-body:first-child{margin:0;border-top:0}.page-body{margin-top:var(--tblr-page-padding-y);margin-bottom:var(--tblr-page-padding-y);display:flex;flex-direction:column;flex:1}.page-body-card{background:var(--tblr-bg-surface);border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent);padding:var(--tblr-page-padding) 0;margin-bottom:0;flex:1}.page-body~.page-body-card{margin-top:0}.page-cover{background:no-repeat center/cover;min-height:9rem}@media(min-width:768px){.page-cover{min-height:12rem}}@media(min-width:992px){.page-cover{min-height:15rem}}.page-cover-overlay{position:relative}.page-cover-overlay:after{content:"";position:absolute;inset:0;background-image:linear-gradient(180deg,#0000,#0009)}.page-header{display:flex;flex-wrap:wrap;min-height:2.25rem;flex-direction:column;justify-content:center;max-width:100%}.page-wrapper .page-header{margin:var(--tblr-page-padding-y) 0 0}.page-header-border{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);padding:var(--tblr-page-padding-y) 0;margin:0!important;background-color:var(--tblr-bg-surface)}.page-pretitle{font-size:.75rem;font-weight:var(--tblr-font-weight-medium);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary)}.page-title{margin:0;font-size:var(--tblr-font-size-h2);line-height:var(--tblr-line-height-h2);font-weight:var(--tblr-font-weight-headings);color:inherit;display:flex;align-items:center}.page-title svg{width:1.5rem;height:1.5rem;margin-right:.25rem}.page-title-lg{font-size:1.5rem;line-height:2rem}.page-subtitle{margin-top:.25rem;color:var(--tblr-secondary)}.page-cover{--tblr-page-cover-blur: 20px;--tblr-page-cover-padding: 1rem;min-height:6rem;padding:var(--tblr-page-cover-padding) 0;position:relative;overflow:hidden}.page-cover-img{position:absolute;top:calc(-2 * var(--tblr-page-cover-blur, 0));left:calc(-2 * var(--tblr-page-cover-blur, 0));right:calc(-2 * var(--tblr-page-cover-blur, 0));bottom:calc(-2 * var(--tblr-page-cover-blur, 0));pointer-events:none;filter:blur(var(--tblr-page-cover-blur));object-fit:cover;background-size:cover;background-position:center;z-index:-1}.page-tabs{margin-top:.5rem;position:relative}.page-header-tabs .nav-bordered{border:0}.page-header-tabs+.page-body-card{margin-top:0}.footer{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);background-color:var(--tblr-bg-surface);padding:2rem 0;color:var(--tblr-gray-500);margin-top:auto}.footer-transparent{background-color:transparent;border-top:0}:root:not(.theme-dark):not([data-bs-theme=dark]) .hide-theme-light{display:none!important}:root:not(.theme-dark):not([data-bs-theme=dark]) .img-dark{display:none!important}:root.theme-dark .hide-theme-dark,:root[data-bs-theme=dark] .hide-theme-dark,body[data-bs-theme=dark] [data-bs-theme=light]:root .hide-theme-dark{display:none!important}:root.theme-dark .img-light,:root[data-bs-theme=dark] .img-light,body[data-bs-theme=dark] [data-bs-theme=light]:root .img-light{display:none!important}[data-bs-theme=dark],body[data-bs-theme=dark] [data-bs-theme=light]{color-scheme:dark;--tblr-body-color: var(--tblr-gray-200);--tblr-secondary: var(--tblr-gray-400);--tblr-body-bg: var(--tblr-gray-900);--tblr-emphasis-color: #ffffff;--tblr-emphasis-color-rgb: 255, 255, 255;--tblr-bg-forms: var(--tblr-gray-900);--tblr-bg-surface: var(--tblr-gray-800);--tblr-bg-surface-inverted: var(--tblr-gray-100);--tblr-bg-surface-secondary: var(--tblr-gray-900);--tblr-bg-surface-tertiary: var(--tblr-gray-800);--tblr-text-inverted: var(--tblr-gray-800);--tblr-link-color: var(--tblr-primary);--tblr-link-hover-color: color-mix(in srgb, var(--tblr-primary), black 20%);--tblr-active-bg: rgb(34.676744186, 45.8627906977, 61.523255814);--tblr-disabled-color: color-mix(in srgb, var(--tblr-body-color) 40%, transparent);--tblr-border-color: var(--tblr-gray-700);--tblr-border-color-translucent: var( --tblr-dark-mode-border-color-translucent );--tblr-border-dark-color: var(--tblr-dark-mode-border-dark-color);--tblr-border-active-color: var( --tblr-dark-mode-border-active-color );--tblr-btn-color: rgb(27.323255814, 36.1372093023, 48.476744186)}[data-bs-theme=dark] .navbar-brand-autodark .navbar-brand-image{filter:brightness(0) invert(1)}.accordion{--tblr-accordion-color: var(--tblr-body-color);--tblr-accordion-border-color: var(--tblr-border-color);--tblr-accordion-border-radius: var(--tblr-border-radius);--tblr-accordion-inner-border-radius: calc(var(--tblr-border-radius) - (var(--tblr-border-width)));--tblr-accordion-padding-x: 1.25rem;--tblr-accordion-gap: 0;--tblr-accordion-active-color: inherit;--tblr-accordion-btn-color: var(--tblr-accordion-color);--tblr-accordion-btn-bg: transparent;--tblr-accordion-btn-toggle-width: 1.25rem;--tblr-accordion-btn-padding-x: var(--tblr-accordion-padding-x);--tblr-accordion-btn-padding-y: 1rem;--tblr-accordion-btn-font-weight: var(--tblr-font-weight-medium);--tblr-accordion-body-padding-x: var(--tblr-accordion-padding-x);--tblr-accordion-body-padding-y: 1rem;display:flex;flex-direction:column;gap:var(--tblr-accordion-gap)}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:var(--tblr-accordion-btn-padding-y) var(--tblr-accordion-padding-x);color:inherit;text-align:inherit;background-color:transparent;border:0;font-size:inherit;font-weight:var(--tblr-accordion-btn-font-weight);gap:.75rem}.accordion-button:not(.collapsed){border-bottom-color:transparent;box-shadow:none;color:var(--tblr-accordion-active-color)}.accordion-header{margin:0;position:relative;display:flex;gap:1rem;align-items:center;width:100%;color:var(--tblr-accordion-btn-color);text-align:left;background-color:transparent;border:0;overflow-anchor:none;transition:transform .3s}.accordion-header:hover{z-index:2}.accordion-header:focus{z-index:3;outline:0;box-shadow:var(--tblr-accordion-btn-focus-box-shadow)}.accordion-header:focus:not(:focus-visible){outline:none;box-shadow:none}.accordion-button-icon{color:var(--tblr-secondary)}.accordion-button-toggle{display:flex;line-height:1;transition:.3s transform;margin-left:auto;margin-right:0;color:var(--tblr-secondary);width:var(--tblr-accordion-btn-toggle-width);height:var(--tblr-accordion-btn-toggle-width)}.accordion-button:not(.collapsed) .accordion-button-toggle{transform:rotate(-180deg);color:var(--tblr-accordion-active-color)}.accordion-button-toggle path{transition:.3s opacity}.accordion-button:not(.collapsed) .accordion-button-toggle-plus path:first-child{opacity:0}.accordion-item{color:var(--tblr-accordion-color);border:var(--tblr-border-width) solid var(--tblr-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--tblr-accordion-border-radius);border-top-right-radius:var(--tblr-accordion-border-radius)}.accordion-item:first-of-type>.accordion-header{border-top-left-radius:var(--tblr-accordion-inner-border-radius);border-top-right-radius:var(--tblr-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--tblr-accordion-border-radius);border-bottom-left-radius:var(--tblr-accordion-border-radius)}.accordion-item:last-of-type>.accordion-header.collapsed{border-bottom-right-radius:var(--tblr-accordion-inner-border-radius);border-bottom-left-radius:var(--tblr-accordion-inner-border-radius)}.accordion-item:last-of-type>.accordion-collapse{border-bottom-right-radius:var(--tblr-accordion-border-radius);border-bottom-left-radius:var(--tblr-accordion-border-radius)}.accordion-body{color:var(--tblr-secondary);padding:0 var(--tblr-accordion-body-padding-x) var(--tblr-accordion-body-padding-y)}.accordion-flush>.accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush>.accordion-item:first-child{border-top:0}.accordion-flush>.accordion-item:last-child{border-bottom:0}.accordion-flush>.accordion-item>.accordion-collapse,.accordion-flush>.accordion-item>.accordion-header .accordion-button,.accordion-flush>.accordion-item>.accordion-header .accordion-button.collapsed{border-radius:0}.accordion-tabs{--tblr-accordion-gap: .75rem}.accordion-tabs>.accordion-item{border:var(--tblr-border-width) solid var(--tblr-accordion-border-color);border-radius:var(--tblr-accordion-border-radius)}.accordion-inverted .accordion-button-toggle{order:-1;margin-left:0}.alert{--tblr-alert-color: var(--tblr-body-color);--tblr-alert-bg: color-mix(in srgb, var(--tblr-alert-color) 10%, transparent);--tblr-alert-padding-x: 1rem;--tblr-alert-padding-y: .75rem;--tblr-alert-margin-bottom: 1rem;--tblr-alert-border-color: color-mix(in srgb, var(--tblr-alert-color) 20%, transparent);--tblr-alert-border: var(--tblr-border-width) solid var(--tblr-alert-border-color);--tblr-alert-border-radius: var(--tblr-border-radius);--tblr-alert-link-color: inherit;--tblr-alert-heading-font-weight: var(--tblr-font-weight-medium);position:relative;padding:var(--tblr-alert-padding-y) var(--tblr-alert-padding-x);margin-bottom:var(--tblr-alert-margin-bottom);background-color:color-mix(in srgb,var(--tblr-alert-bg),var(--tblr-bg-surface));border-radius:var(--tblr-alert-border-radius);border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-alert-border-color);display:flex;flex-direction:row;gap:1rem}.alert-heading{color:inherit;margin-bottom:.25rem;font-weight:var(--tblr-alert-heading-font-weight)}.alert-description{color:var(--tblr-secondary)}.alert-icon{color:var(--tblr-alert-color);width:1.25rem!important;height:1.25rem!important}.alert-action{color:var(--tblr-alert-color);text-decoration:underline}.alert-action:hover{text-decoration:none}.alert-list{margin:0}.alert-link{font-weight:var(--tblr-font-weight-bold);color:var(--tblr-alert-link-color)}.alert-link,.alert-link:hover{color:var(--tblr-alert-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:calc(var(--tblr-alert-padding-x) / 2 - 1px);right:calc(var(--tblr-alert-padding-y) / 2 - 1px);z-index:1;padding:calc(var(--tblr-alert-padding-y) * 1.25) var(--tblr-alert-padding-x)}.alert-important{border-color:var(--tblr-alert-color);background-color:var(--tblr-alert-color);color:var(--tblr-white)}.alert-important .alert-description,.alert-important .alert-icon{color:inherit}.alert-minor{background:transparent;border-color:var(--tblr-border-color)}.alert-primary{--tblr-alert-color: var(--tblr-primary)}.alert-secondary{--tblr-alert-color: var(--tblr-secondary)}.alert-success{--tblr-alert-color: var(--tblr-success)}.alert-info{--tblr-alert-color: var(--tblr-info)}.alert-warning{--tblr-alert-color: var(--tblr-warning)}.alert-danger{--tblr-alert-color: var(--tblr-danger)}.alert-light{--tblr-alert-color: var(--tblr-light)}.alert-dark{--tblr-alert-color: var(--tblr-dark)}.alert-muted{--tblr-alert-color: var(--tblr-muted)}.alert-blue{--tblr-alert-color: var(--tblr-blue)}.alert-azure{--tblr-alert-color: var(--tblr-azure)}.alert-indigo{--tblr-alert-color: var(--tblr-indigo)}.alert-purple{--tblr-alert-color: var(--tblr-purple)}.alert-pink{--tblr-alert-color: var(--tblr-pink)}.alert-red{--tblr-alert-color: var(--tblr-red)}.alert-orange{--tblr-alert-color: var(--tblr-orange)}.alert-yellow{--tblr-alert-color: var(--tblr-yellow)}.alert-lime{--tblr-alert-color: var(--tblr-lime)}.alert-green{--tblr-alert-color: var(--tblr-green)}.alert-teal{--tblr-alert-color: var(--tblr-teal)}.alert-cyan{--tblr-alert-color: var(--tblr-cyan)}.avatar{--tblr-avatar-size: var(--tblr-avatar-list-size, 2.5rem);--tblr-avatar-status-size: .75rem;--tblr-avatar-bg: var(--tblr-bg-surface-secondary);--tblr-avatar-box-shadow-color: var(--tblr-border-color-translucent);--tblr-avatar-box-shadow: inset 0 0 0 1px var(--tblr-avatar-box-shadow-color);--tblr-avatar-font-size: 1rem;--tblr-avatar-icon-size: 1.5rem;--tblr-avatar-brand-size: 1.25rem;position:relative;width:var(--tblr-avatar-size);height:var(--tblr-avatar-size);font-size:var(--tblr-avatar-font-size);font-weight:var(--tblr-font-weight-medium);line-height:1;display:inline-flex;align-items:center;justify-content:center;color:var(--tblr-secondary);text-align:center;text-transform:uppercase;vertical-align:bottom;user-select:none;background:var(--tblr-avatar-bg) no-repeat center/cover;border-radius:var(--tblr-border-radius);box-shadow:var(--tblr-avatar-box-shadow);transition:color .3s,background-color .3s,box-shadow .3s}.avatar .icon{width:var(--tblr-avatar-icon-size);height:var(--tblr-avatar-icon-size)}.avatar .badge{position:absolute;right:0;bottom:0;border-radius:100rem;box-shadow:0 0 0 calc(var(--tblr-avatar-status-size) / 4) var(--tblr-bg-surface)}a.avatar{cursor:pointer}a.avatar:hover{color:var(--tblr-primary);--tblr-avatar-box-shadow-color: var(--tblr-primary)}.avatar-rounded{border-radius:100rem}.avatar-xxs{--tblr-avatar-size: 1rem;--tblr-avatar-status-size: .25rem;--tblr-avatar-font-size: .5rem;--tblr-avatar-icon-size: .5rem;--tblr-avatar-brand-size: .5rem}.avatar-xxs .badge:empty{width:.25rem;height:.25rem}.avatar-xs{--tblr-avatar-size: 1.25rem;--tblr-avatar-status-size: .375rem;--tblr-avatar-font-size: .625rem;--tblr-avatar-icon-size: .75rem;--tblr-avatar-brand-size: .75rem}.avatar-xs .badge:empty{width:.375rem;height:.375rem}.avatar-sm{--tblr-avatar-size: 2rem;--tblr-avatar-status-size: .5rem;--tblr-avatar-font-size: .75rem;--tblr-avatar-icon-size: 1.5rem;--tblr-avatar-brand-size: 1rem}.avatar-sm .badge:empty{width:.5rem;height:.5rem}.avatar-md{--tblr-avatar-size: 2.5rem;--tblr-avatar-status-size: .75rem;--tblr-avatar-font-size: .875rem;--tblr-avatar-icon-size: 1.5rem;--tblr-avatar-brand-size: 1.25rem}.avatar-md .badge:empty{width:.75rem;height:.75rem}.avatar-lg{--tblr-avatar-size: 3rem;--tblr-avatar-status-size: .75rem;--tblr-avatar-font-size: 1.25rem;--tblr-avatar-icon-size: 2rem;--tblr-avatar-brand-size: 1.25rem}.avatar-lg .badge:empty{width:.75rem;height:.75rem}.avatar-xl{--tblr-avatar-size: 5rem;--tblr-avatar-status-size: 1rem;--tblr-avatar-font-size: 2rem;--tblr-avatar-icon-size: 3rem;--tblr-avatar-brand-size: 1.25rem}.avatar-xl .badge:empty{width:1rem;height:1rem}.avatar-2xl{--tblr-avatar-size: 7rem;--tblr-avatar-status-size: 1rem;--tblr-avatar-font-size: 3rem;--tblr-avatar-icon-size: 5rem;--tblr-avatar-brand-size: 2rem}.avatar-2xl .badge:empty{width:1rem;height:1rem}.avatar-list{--tblr-avatar-list-size: 2.5rem;--tblr-list-gap: .5rem;display:flex;flex-wrap:wrap;gap:var(--tblr-list-gap)}.avatar-list a.avatar:hover{z-index:1}.avatar-list-stacked{display:block;--tblr-list-gap: 0}.avatar-list-stacked .avatar{margin-right:calc(-.5 * var(--tblr-avatar-size))!important;box-shadow:var(--tblr-avatar-box-shadow),0 0 0 2px var(--tblr-card-bg, var(--tblr-bg-surface))}.avatar-list-xxs{--tblr-avatar-list-size: 1rem}.avatar-list-xs{--tblr-avatar-list-size: 1.25rem}.avatar-list-sm{--tblr-avatar-list-size: 2rem}.avatar-list-md{--tblr-avatar-list-size: 2.5rem}.avatar-list-lg{--tblr-avatar-list-size: 3rem}.avatar-list-xl{--tblr-avatar-list-size: 5rem}.avatar-list-2xl{--tblr-avatar-list-size: 7rem}.avatar-upload{border:var(--tblr-border-width) dashed var(--tblr-border-color);background:var(--tblr-bg-forms);box-shadow:none;flex-direction:column;transition:color .3s,background-color .3s}@media(prefers-reduced-motion:reduce){.avatar-upload{transition:none}}.avatar-upload svg{width:1.5rem;height:1.5rem;stroke-width:1}.avatar-upload:hover{border-color:var(--tblr-primary);color:var(--tblr-primary);text-decoration:none}.avatar-upload-text{font-size:.625rem;line-height:1;margin-top:.25rem}.avatar-cover{margin-top:calc(-.5 * var(--tblr-avatar-size));box-shadow:0 0 0 .25rem var(--tblr-card-bg, var(--tblr-body-bg))}.avatar-brand{width:var(--tblr-avatar-brand-size);height:var(--tblr-avatar-brand-size);position:absolute;right:-2px;bottom:-2px;z-index:1000;background:var(--tblr-bg-surface);border-radius:var(--tblr-border-radius);border:1px solid var(--tblr-border-color)}.badge{--tblr-badge-padding-x: .5em;--tblr-badge-padding-y: .25em;--tblr-badge-font-size: .85714285em;--tblr-badge-font-weight: var(--tblr-font-weight-medium);--tblr-badge-color: var(--tblr-secondary);--tblr-badge-border-radius: var(--tblr-border-radius);--tblr-badge-icon-size: 1em;--tblr-badge-line-height: 1;display:inline-flex;padding:var(--tblr-badge-padding-y) var(--tblr-badge-padding-x);font-weight:var(--tblr-badge-font-weight);font-size:var(--tblr-badge-font-size);color:var(--tblr-badge-color);text-align:center;white-space:nowrap;justify-content:center;align-items:center;gap:.25rem;background:var(--tblr-bg-surface-secondary);overflow:hidden;user-select:none;border:var(--tblr-border-width) var(--tblr-border-style) transparent;border-radius:var(--tblr-badge-border-radius);min-width:calc(1em + var(--tblr-badge-padding-y) * 2 + 2px);letter-spacing:.04em;vertical-align:bottom;line-height:var(--tblr-badge-line-height)}a.badge{background:var(--tblr-bg-surface-secondary)}.badge .icon{width:1em;height:1em;font-size:var(--tblr-badge-icon-size);stroke-width:2}.badge:empty,.badge-dot{display:inline-block;width:10px;height:10px;min-width:0;min-height:auto;padding:0;border-radius:100rem;vertical-align:baseline}.badge-outline{background-color:transparent;border:var(--tblr-border-width) var(--tblr-border-style) currentColor}.badge-pill{border-radius:100rem}.badges-list{--tblr-list-gap: .5rem;display:flex;flex-wrap:wrap;gap:var(--tblr-list-gap)}.badge-notification{position:absolute!important;top:0!important;right:0!important;transform:translate(50%,-50%);z-index:1}.badge-blink{animation:blink 2s infinite}.badge-sm{--tblr-badge-font-size: .71428571em;--tblr-badge-icon-size: 1em;--tblr-badge-padding-y: 2px;--tblr-badge-padding-x: .25rem}.badge-lg{--tblr-badge-font-size: 1em;--tblr-badge-icon-size: 1em;--tblr-badge-padding-y: .25rem;--tblr-badge-padding-x: .5rem}.badge-icononly{--tblr-badge-padding-x: 0}.breadcrumb{--tblr-breadcrumb-padding-x: 0;--tblr-breadcrumb-padding-y: 0;--tblr-breadcrumb-margin-bottom: 1rem;--tblr-breadcrumb-font-size: ;--tblr-breadcrumb-bg: ;--tblr-breadcrumb-border-radius: ;--tblr-breadcrumb-divider-color: var(--tblr-gray-500);--tblr-breadcrumb-item-padding-x: .5rem;--tblr-breadcrumb-item-active-color: inherit;--tblr-breadcrumb-item-active-font-weight: var(--tblr-font-weight-bold);--tblr-breadcrumb-item-disabled-color: var(--tblr-disabled-color);--tblr-breadcrumb-link-color: var(--tblr-link-color);display:flex;flex-wrap:wrap;font-size:var(--tblr-breadcrumb-font-size);list-style:none;background-color:var(--tblr-breadcrumb-bg);border-radius:var(--tblr-breadcrumb-border-radius);padding:0;margin:0;background:transparent}.breadcrumb a{color:var(--tblr-breadcrumb-link-color)}.breadcrumb a:hover{text-decoration:underline}.breadcrumb-muted{--tblr-breadcrumb-link-color: var(--tblr-secondary)}.breadcrumb-item.active{color:var(--tblr-breadcrumb-item-active-color);font-weight:var(--tblr-breadcrumb-item-active-font-weight)}.breadcrumb-item.active a{color:inherit;pointer-events:none}.breadcrumb-item.disabled{color:var(--tblr-breadcrumb-item-disabled-color)}.breadcrumb-item.disabled:before{color:inherit}.breadcrumb-item.disabled a{color:inherit;pointer-events:none}.breadcrumb-item+.breadcrumb-item{padding-left:var(--tblr-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item:before{float:left;padding-right:var(--tblr-breadcrumb-item-padding-x);color:var(--tblr-breadcrumb-divider-color);content:var(--tblr-breadcrumb-divider, "/")}.breadcrumb-dots{--tblr-breadcrumb-divider: "\b7"}.breadcrumb-arrows{--tblr-breadcrumb-divider: "\203a"}.breadcrumb-bullets{--tblr-breadcrumb-divider: "\2022"}.btn{--tblr-btn-icon-size: 1.25rem;--tblr-btn-icon-color: inherit;--tblr-btn-bg: var(--tblr-bg-surface);--tblr-btn-color: var(--tblr-body-color);--tblr-btn-border-color: var(--tblr-border-color);--tblr-btn-hover-bg: var(--tblr-btn-bg);--tblr-btn-hover-border-color: var(--tblr-border-active-color);--tblr-btn-active-color: var(--tblr-primary);--tblr-btn-active-bg: rgba(var(--tblr-primary-rgb), .04);--tblr-btn-active-border-color: var(--tblr-primary);display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;box-shadow:var(--tblr-btn-box-shadow);position:relative;min-width:calc(var(--tblr-btn-line-height) * 1 + var(--tblr-btn-padding-y) * 2 + var(--tblr-btn-border-width) * 2);min-height:calc(var(--tblr-btn-line-height) * 1 + var(--tblr-btn-padding-y) * 2 + var(--tblr-btn-border-width) * 2)}.btn .icon{width:var(--tblr-btn-icon-size);height:var(--tblr-btn-icon-size);min-width:var(--tblr-btn-icon-size);font-size:var(--tblr-btn-icon-size);margin:0 calc(var(--tblr-btn-padding-x) / 2) 0 calc(var(--tblr-btn-padding-x) / -4);vertical-align:bottom;color:var(--tblr-btn-icon-color)}.btn .avatar{width:var(--tblr-btn-icon-size);height:var(--tblr-btn-icon-size);margin:0 calc(var(--tblr-btn-padding-x) / 2) 0 calc(var(--tblr-btn-padding-x) / -4)}.btn .icon-right,.btn .icon-end{margin:0 calc(var(--tblr-btn-padding-x) / -4) 0 calc(var(--tblr-btn-padding-x) / 2)}.btn .badge{top:auto}.btn-check+.btn:hover{color:var(--tblr-btn-hover-color);background-color:var(--tblr-btn-hover-bg);border-color:var(--tblr-btn-hover-border-color)}.btn-link{color:#009f95;background-color:transparent;border-color:transparent;box-shadow:none}.btn-link .icon{color:inherit}.btn-link:hover{color:#006a64;border-color:transparent}.btn-primary{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-primary-fg, #ffffff);--tblr-btn-bg: var(--tblr-primary);--tblr-btn-hover-color: var(--tblr-primary-fg);--tblr-btn-hover-bg: var(--tblr-primary-darken);--tblr-btn-active-color: var(--tblr-primary-fg);--tblr-btn-active-bg: var(--tblr-primary-darken);--tblr-btn-disabled-bg: var(--tblr-primary);--tblr-btn-disabled-color: var(--tblr-primary-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-primary,.btn-outline.btn-primary{--tblr-btn-color: var(--tblr-primary);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-primary);--tblr-btn-hover-color: var(--tblr-primary-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-primary);--tblr-btn-active-color: var(--tblr-primary-fg);--tblr-btn-active-bg: var(--tblr-primary);--tblr-btn-active-border-color: var(--tblr-primary);--tblr-btn-disabled-color: var(--tblr-primary);--tblr-btn-disabled-border-color: var(--tblr-primary)}.btn-ghost-primary,.btn-ghost.btn-primary{--tblr-btn-color: var(--tblr-primary);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-primary-fg);--tblr-btn-hover-bg: var(--tblr-primary);--tblr-btn-hover-border-color: var(--tblr-primary);--tblr-btn-active-color: var(--tblr-primary-fg);--tblr-btn-active-bg: var(--tblr-primary);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-primary);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-secondary,.btn-grey,.btn-gray{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-secondary-fg, #ffffff);--tblr-btn-bg: var(--tblr-secondary);--tblr-btn-hover-color: var(--tblr-secondary-fg);--tblr-btn-hover-bg: var(--tblr-secondary-darken);--tblr-btn-active-color: var(--tblr-secondary-fg);--tblr-btn-active-bg: var(--tblr-secondary-darken);--tblr-btn-disabled-bg: var(--tblr-secondary);--tblr-btn-disabled-color: var(--tblr-secondary-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-secondary,.btn-outline.btn-secondary,.btn-outline.btn-grey,.btn-outline.btn-gray{--tblr-btn-color: var(--tblr-secondary);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-secondary);--tblr-btn-hover-color: var(--tblr-secondary-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-secondary);--tblr-btn-active-color: var(--tblr-secondary-fg);--tblr-btn-active-bg: var(--tblr-secondary);--tblr-btn-active-border-color: var(--tblr-secondary);--tblr-btn-disabled-color: var(--tblr-secondary);--tblr-btn-disabled-border-color: var(--tblr-secondary)}.btn-ghost-secondary,.btn-ghost.btn-secondary,.btn-ghost.btn-grey,.btn-ghost.btn-gray{--tblr-btn-color: var(--tblr-secondary);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-secondary-fg);--tblr-btn-hover-bg: var(--tblr-secondary);--tblr-btn-hover-border-color: var(--tblr-secondary);--tblr-btn-active-color: var(--tblr-secondary-fg);--tblr-btn-active-bg: var(--tblr-secondary);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-secondary);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-success{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-success-fg, #ffffff);--tblr-btn-bg: var(--tblr-success);--tblr-btn-hover-color: var(--tblr-success-fg);--tblr-btn-hover-bg: var(--tblr-success-darken);--tblr-btn-active-color: var(--tblr-success-fg);--tblr-btn-active-bg: var(--tblr-success-darken);--tblr-btn-disabled-bg: var(--tblr-success);--tblr-btn-disabled-color: var(--tblr-success-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-success,.btn-outline.btn-success{--tblr-btn-color: var(--tblr-success);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-success);--tblr-btn-hover-color: var(--tblr-success-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-success);--tblr-btn-active-color: var(--tblr-success-fg);--tblr-btn-active-bg: var(--tblr-success);--tblr-btn-active-border-color: var(--tblr-success);--tblr-btn-disabled-color: var(--tblr-success);--tblr-btn-disabled-border-color: var(--tblr-success)}.btn-ghost-success,.btn-ghost.btn-success{--tblr-btn-color: var(--tblr-success);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-success-fg);--tblr-btn-hover-bg: var(--tblr-success);--tblr-btn-hover-border-color: var(--tblr-success);--tblr-btn-active-color: var(--tblr-success-fg);--tblr-btn-active-bg: var(--tblr-success);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-success);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-info{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-info-fg, #ffffff);--tblr-btn-bg: var(--tblr-info);--tblr-btn-hover-color: var(--tblr-info-fg);--tblr-btn-hover-bg: var(--tblr-info-darken);--tblr-btn-active-color: var(--tblr-info-fg);--tblr-btn-active-bg: var(--tblr-info-darken);--tblr-btn-disabled-bg: var(--tblr-info);--tblr-btn-disabled-color: var(--tblr-info-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-info,.btn-outline.btn-info{--tblr-btn-color: var(--tblr-info);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-info);--tblr-btn-hover-color: var(--tblr-info-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-info);--tblr-btn-active-color: var(--tblr-info-fg);--tblr-btn-active-bg: var(--tblr-info);--tblr-btn-active-border-color: var(--tblr-info);--tblr-btn-disabled-color: var(--tblr-info);--tblr-btn-disabled-border-color: var(--tblr-info)}.btn-ghost-info,.btn-ghost.btn-info{--tblr-btn-color: var(--tblr-info);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-info-fg);--tblr-btn-hover-bg: var(--tblr-info);--tblr-btn-hover-border-color: var(--tblr-info);--tblr-btn-active-color: var(--tblr-info-fg);--tblr-btn-active-bg: var(--tblr-info);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-info);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-warning{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-warning-fg, #ffffff);--tblr-btn-bg: var(--tblr-warning);--tblr-btn-hover-color: var(--tblr-warning-fg);--tblr-btn-hover-bg: var(--tblr-warning-darken);--tblr-btn-active-color: var(--tblr-warning-fg);--tblr-btn-active-bg: var(--tblr-warning-darken);--tblr-btn-disabled-bg: var(--tblr-warning);--tblr-btn-disabled-color: var(--tblr-warning-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-warning,.btn-outline.btn-warning{--tblr-btn-color: var(--tblr-warning);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-warning);--tblr-btn-hover-color: var(--tblr-warning-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-warning);--tblr-btn-active-color: var(--tblr-warning-fg);--tblr-btn-active-bg: var(--tblr-warning);--tblr-btn-active-border-color: var(--tblr-warning);--tblr-btn-disabled-color: var(--tblr-warning);--tblr-btn-disabled-border-color: var(--tblr-warning)}.btn-ghost-warning,.btn-ghost.btn-warning{--tblr-btn-color: var(--tblr-warning);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-warning-fg);--tblr-btn-hover-bg: var(--tblr-warning);--tblr-btn-hover-border-color: var(--tblr-warning);--tblr-btn-active-color: var(--tblr-warning-fg);--tblr-btn-active-bg: var(--tblr-warning);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-warning);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-danger{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-danger-fg, #ffffff);--tblr-btn-bg: var(--tblr-danger);--tblr-btn-hover-color: var(--tblr-danger-fg);--tblr-btn-hover-bg: var(--tblr-danger-darken);--tblr-btn-active-color: var(--tblr-danger-fg);--tblr-btn-active-bg: var(--tblr-danger-darken);--tblr-btn-disabled-bg: var(--tblr-danger);--tblr-btn-disabled-color: var(--tblr-danger-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-danger,.btn-outline.btn-danger{--tblr-btn-color: var(--tblr-danger);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-danger);--tblr-btn-hover-color: var(--tblr-danger-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-danger);--tblr-btn-active-color: var(--tblr-danger-fg);--tblr-btn-active-bg: var(--tblr-danger);--tblr-btn-active-border-color: var(--tblr-danger);--tblr-btn-disabled-color: var(--tblr-danger);--tblr-btn-disabled-border-color: var(--tblr-danger)}.btn-ghost-danger,.btn-ghost.btn-danger{--tblr-btn-color: var(--tblr-danger);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-danger-fg);--tblr-btn-hover-bg: var(--tblr-danger);--tblr-btn-hover-border-color: var(--tblr-danger);--tblr-btn-active-color: var(--tblr-danger-fg);--tblr-btn-active-bg: var(--tblr-danger);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-danger);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-light,.btn-white{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-light-fg, #ffffff);--tblr-btn-bg: var(--tblr-light);--tblr-btn-hover-color: var(--tblr-light-fg);--tblr-btn-hover-bg: var(--tblr-light-darken);--tblr-btn-active-color: var(--tblr-light-fg);--tblr-btn-active-bg: var(--tblr-light-darken);--tblr-btn-disabled-bg: var(--tblr-light);--tblr-btn-disabled-color: var(--tblr-light-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-light,.btn-outline.btn-light,.btn-outline.btn-white{--tblr-btn-color: var(--tblr-light);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-light);--tblr-btn-hover-color: var(--tblr-light-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-light);--tblr-btn-active-color: var(--tblr-light-fg);--tblr-btn-active-bg: var(--tblr-light);--tblr-btn-active-border-color: var(--tblr-light);--tblr-btn-disabled-color: var(--tblr-light);--tblr-btn-disabled-border-color: var(--tblr-light)}.btn-ghost-light,.btn-ghost.btn-light,.btn-ghost.btn-white{--tblr-btn-color: var(--tblr-light);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-light-fg);--tblr-btn-hover-bg: var(--tblr-light);--tblr-btn-hover-border-color: var(--tblr-light);--tblr-btn-active-color: var(--tblr-light-fg);--tblr-btn-active-bg: var(--tblr-light);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-light);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-dark,.btn-black{--tblr-btn-border-color: var(--tblr-dark-mode-border-color);--tblr-btn-hover-border-color: var(--tblr-dark-mode-border-active-color);--tblr-btn-active-border-color: var(--tblr-dark-mode-border-active-color);--tblr-btn-color: var(--tblr-dark-fg, #ffffff);--tblr-btn-bg: var(--tblr-dark);--tblr-btn-hover-color: var(--tblr-dark-fg);--tblr-btn-hover-bg: var(--tblr-dark-darken);--tblr-btn-active-color: var(--tblr-dark-fg);--tblr-btn-active-bg: var(--tblr-dark-darken);--tblr-btn-disabled-bg: var(--tblr-dark);--tblr-btn-disabled-color: var(--tblr-dark-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-dark,.btn-outline.btn-dark,.btn-outline.btn-black{--tblr-btn-color: var(--tblr-dark);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-dark);--tblr-btn-hover-color: var(--tblr-dark-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-dark);--tblr-btn-active-color: var(--tblr-dark-fg);--tblr-btn-active-bg: var(--tblr-dark);--tblr-btn-active-border-color: var(--tblr-dark);--tblr-btn-disabled-color: var(--tblr-dark);--tblr-btn-disabled-border-color: var(--tblr-dark)}.btn-ghost-dark,.btn-ghost.btn-dark,.btn-ghost.btn-black{--tblr-btn-color: var(--tblr-dark);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-dark-fg);--tblr-btn-hover-bg: var(--tblr-dark);--tblr-btn-hover-border-color: var(--tblr-dark);--tblr-btn-active-color: var(--tblr-dark-fg);--tblr-btn-active-bg: var(--tblr-dark);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-dark);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-muted{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-muted-fg, #ffffff);--tblr-btn-bg: var(--tblr-muted);--tblr-btn-hover-color: var(--tblr-muted-fg);--tblr-btn-hover-bg: var(--tblr-muted-darken);--tblr-btn-active-color: var(--tblr-muted-fg);--tblr-btn-active-bg: var(--tblr-muted-darken);--tblr-btn-disabled-bg: var(--tblr-muted);--tblr-btn-disabled-color: var(--tblr-muted-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-muted,.btn-outline.btn-muted{--tblr-btn-color: var(--tblr-muted);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-muted);--tblr-btn-hover-color: var(--tblr-muted-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-muted);--tblr-btn-active-color: var(--tblr-muted-fg);--tblr-btn-active-bg: var(--tblr-muted);--tblr-btn-active-border-color: var(--tblr-muted);--tblr-btn-disabled-color: var(--tblr-muted);--tblr-btn-disabled-border-color: var(--tblr-muted)}.btn-ghost-muted,.btn-ghost.btn-muted{--tblr-btn-color: var(--tblr-muted);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-muted-fg);--tblr-btn-hover-bg: var(--tblr-muted);--tblr-btn-hover-border-color: var(--tblr-muted);--tblr-btn-active-color: var(--tblr-muted-fg);--tblr-btn-active-bg: var(--tblr-muted);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-muted);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-blue{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-blue-fg, #ffffff);--tblr-btn-bg: var(--tblr-blue);--tblr-btn-hover-color: var(--tblr-blue-fg);--tblr-btn-hover-bg: var(--tblr-blue-darken);--tblr-btn-active-color: var(--tblr-blue-fg);--tblr-btn-active-bg: var(--tblr-blue-darken);--tblr-btn-disabled-bg: var(--tblr-blue);--tblr-btn-disabled-color: var(--tblr-blue-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-blue,.btn-outline.btn-blue{--tblr-btn-color: var(--tblr-blue);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-blue);--tblr-btn-hover-color: var(--tblr-blue-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-blue);--tblr-btn-active-color: var(--tblr-blue-fg);--tblr-btn-active-bg: var(--tblr-blue);--tblr-btn-active-border-color: var(--tblr-blue);--tblr-btn-disabled-color: var(--tblr-blue);--tblr-btn-disabled-border-color: var(--tblr-blue)}.btn-ghost-blue,.btn-ghost.btn-blue{--tblr-btn-color: var(--tblr-blue);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-blue-fg);--tblr-btn-hover-bg: var(--tblr-blue);--tblr-btn-hover-border-color: var(--tblr-blue);--tblr-btn-active-color: var(--tblr-blue-fg);--tblr-btn-active-bg: var(--tblr-blue);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-blue);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-azure{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-azure-fg, #ffffff);--tblr-btn-bg: var(--tblr-azure);--tblr-btn-hover-color: var(--tblr-azure-fg);--tblr-btn-hover-bg: var(--tblr-azure-darken);--tblr-btn-active-color: var(--tblr-azure-fg);--tblr-btn-active-bg: var(--tblr-azure-darken);--tblr-btn-disabled-bg: var(--tblr-azure);--tblr-btn-disabled-color: var(--tblr-azure-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-azure,.btn-outline.btn-azure{--tblr-btn-color: var(--tblr-azure);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-azure);--tblr-btn-hover-color: var(--tblr-azure-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-azure);--tblr-btn-active-color: var(--tblr-azure-fg);--tblr-btn-active-bg: var(--tblr-azure);--tblr-btn-active-border-color: var(--tblr-azure);--tblr-btn-disabled-color: var(--tblr-azure);--tblr-btn-disabled-border-color: var(--tblr-azure)}.btn-ghost-azure,.btn-ghost.btn-azure{--tblr-btn-color: var(--tblr-azure);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-azure-fg);--tblr-btn-hover-bg: var(--tblr-azure);--tblr-btn-hover-border-color: var(--tblr-azure);--tblr-btn-active-color: var(--tblr-azure-fg);--tblr-btn-active-bg: var(--tblr-azure);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-azure);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-indigo{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-indigo-fg, #ffffff);--tblr-btn-bg: var(--tblr-indigo);--tblr-btn-hover-color: var(--tblr-indigo-fg);--tblr-btn-hover-bg: var(--tblr-indigo-darken);--tblr-btn-active-color: var(--tblr-indigo-fg);--tblr-btn-active-bg: var(--tblr-indigo-darken);--tblr-btn-disabled-bg: var(--tblr-indigo);--tblr-btn-disabled-color: var(--tblr-indigo-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-indigo,.btn-outline.btn-indigo{--tblr-btn-color: var(--tblr-indigo);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-indigo);--tblr-btn-hover-color: var(--tblr-indigo-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-indigo);--tblr-btn-active-color: var(--tblr-indigo-fg);--tblr-btn-active-bg: var(--tblr-indigo);--tblr-btn-active-border-color: var(--tblr-indigo);--tblr-btn-disabled-color: var(--tblr-indigo);--tblr-btn-disabled-border-color: var(--tblr-indigo)}.btn-ghost-indigo,.btn-ghost.btn-indigo{--tblr-btn-color: var(--tblr-indigo);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-indigo-fg);--tblr-btn-hover-bg: var(--tblr-indigo);--tblr-btn-hover-border-color: var(--tblr-indigo);--tblr-btn-active-color: var(--tblr-indigo-fg);--tblr-btn-active-bg: var(--tblr-indigo);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-indigo);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-purple{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-purple-fg, #ffffff);--tblr-btn-bg: var(--tblr-purple);--tblr-btn-hover-color: var(--tblr-purple-fg);--tblr-btn-hover-bg: var(--tblr-purple-darken);--tblr-btn-active-color: var(--tblr-purple-fg);--tblr-btn-active-bg: var(--tblr-purple-darken);--tblr-btn-disabled-bg: var(--tblr-purple);--tblr-btn-disabled-color: var(--tblr-purple-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-purple,.btn-outline.btn-purple{--tblr-btn-color: var(--tblr-purple);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-purple);--tblr-btn-hover-color: var(--tblr-purple-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-purple);--tblr-btn-active-color: var(--tblr-purple-fg);--tblr-btn-active-bg: var(--tblr-purple);--tblr-btn-active-border-color: var(--tblr-purple);--tblr-btn-disabled-color: var(--tblr-purple);--tblr-btn-disabled-border-color: var(--tblr-purple)}.btn-ghost-purple,.btn-ghost.btn-purple{--tblr-btn-color: var(--tblr-purple);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-purple-fg);--tblr-btn-hover-bg: var(--tblr-purple);--tblr-btn-hover-border-color: var(--tblr-purple);--tblr-btn-active-color: var(--tblr-purple-fg);--tblr-btn-active-bg: var(--tblr-purple);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-purple);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-pink{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-pink-fg, #ffffff);--tblr-btn-bg: var(--tblr-pink);--tblr-btn-hover-color: var(--tblr-pink-fg);--tblr-btn-hover-bg: var(--tblr-pink-darken);--tblr-btn-active-color: var(--tblr-pink-fg);--tblr-btn-active-bg: var(--tblr-pink-darken);--tblr-btn-disabled-bg: var(--tblr-pink);--tblr-btn-disabled-color: var(--tblr-pink-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-pink,.btn-outline.btn-pink{--tblr-btn-color: var(--tblr-pink);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-pink);--tblr-btn-hover-color: var(--tblr-pink-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-pink);--tblr-btn-active-color: var(--tblr-pink-fg);--tblr-btn-active-bg: var(--tblr-pink);--tblr-btn-active-border-color: var(--tblr-pink);--tblr-btn-disabled-color: var(--tblr-pink);--tblr-btn-disabled-border-color: var(--tblr-pink)}.btn-ghost-pink,.btn-ghost.btn-pink{--tblr-btn-color: var(--tblr-pink);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-pink-fg);--tblr-btn-hover-bg: var(--tblr-pink);--tblr-btn-hover-border-color: var(--tblr-pink);--tblr-btn-active-color: var(--tblr-pink-fg);--tblr-btn-active-bg: var(--tblr-pink);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-pink);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-red{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-red-fg, #ffffff);--tblr-btn-bg: var(--tblr-red);--tblr-btn-hover-color: var(--tblr-red-fg);--tblr-btn-hover-bg: var(--tblr-red-darken);--tblr-btn-active-color: var(--tblr-red-fg);--tblr-btn-active-bg: var(--tblr-red-darken);--tblr-btn-disabled-bg: var(--tblr-red);--tblr-btn-disabled-color: var(--tblr-red-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-red,.btn-outline.btn-red{--tblr-btn-color: var(--tblr-red);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-red);--tblr-btn-hover-color: var(--tblr-red-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-red);--tblr-btn-active-color: var(--tblr-red-fg);--tblr-btn-active-bg: var(--tblr-red);--tblr-btn-active-border-color: var(--tblr-red);--tblr-btn-disabled-color: var(--tblr-red);--tblr-btn-disabled-border-color: var(--tblr-red)}.btn-ghost-red,.btn-ghost.btn-red{--tblr-btn-color: var(--tblr-red);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-red-fg);--tblr-btn-hover-bg: var(--tblr-red);--tblr-btn-hover-border-color: var(--tblr-red);--tblr-btn-active-color: var(--tblr-red-fg);--tblr-btn-active-bg: var(--tblr-red);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-red);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-orange{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-orange-fg, #ffffff);--tblr-btn-bg: var(--tblr-orange);--tblr-btn-hover-color: var(--tblr-orange-fg);--tblr-btn-hover-bg: var(--tblr-orange-darken);--tblr-btn-active-color: var(--tblr-orange-fg);--tblr-btn-active-bg: var(--tblr-orange-darken);--tblr-btn-disabled-bg: var(--tblr-orange);--tblr-btn-disabled-color: var(--tblr-orange-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-orange,.btn-outline.btn-orange{--tblr-btn-color: var(--tblr-orange);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-orange);--tblr-btn-hover-color: var(--tblr-orange-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-orange);--tblr-btn-active-color: var(--tblr-orange-fg);--tblr-btn-active-bg: var(--tblr-orange);--tblr-btn-active-border-color: var(--tblr-orange);--tblr-btn-disabled-color: var(--tblr-orange);--tblr-btn-disabled-border-color: var(--tblr-orange)}.btn-ghost-orange,.btn-ghost.btn-orange{--tblr-btn-color: var(--tblr-orange);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-orange-fg);--tblr-btn-hover-bg: var(--tblr-orange);--tblr-btn-hover-border-color: var(--tblr-orange);--tblr-btn-active-color: var(--tblr-orange-fg);--tblr-btn-active-bg: var(--tblr-orange);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-orange);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-yellow{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-yellow-fg, #ffffff);--tblr-btn-bg: var(--tblr-yellow);--tblr-btn-hover-color: var(--tblr-yellow-fg);--tblr-btn-hover-bg: var(--tblr-yellow-darken);--tblr-btn-active-color: var(--tblr-yellow-fg);--tblr-btn-active-bg: var(--tblr-yellow-darken);--tblr-btn-disabled-bg: var(--tblr-yellow);--tblr-btn-disabled-color: var(--tblr-yellow-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-yellow,.btn-outline.btn-yellow{--tblr-btn-color: var(--tblr-yellow);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-yellow);--tblr-btn-hover-color: var(--tblr-yellow-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-yellow);--tblr-btn-active-color: var(--tblr-yellow-fg);--tblr-btn-active-bg: var(--tblr-yellow);--tblr-btn-active-border-color: var(--tblr-yellow);--tblr-btn-disabled-color: var(--tblr-yellow);--tblr-btn-disabled-border-color: var(--tblr-yellow)}.btn-ghost-yellow,.btn-ghost.btn-yellow{--tblr-btn-color: var(--tblr-yellow);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-yellow-fg);--tblr-btn-hover-bg: var(--tblr-yellow);--tblr-btn-hover-border-color: var(--tblr-yellow);--tblr-btn-active-color: var(--tblr-yellow-fg);--tblr-btn-active-bg: var(--tblr-yellow);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-yellow);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-lime{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-lime-fg, #ffffff);--tblr-btn-bg: var(--tblr-lime);--tblr-btn-hover-color: var(--tblr-lime-fg);--tblr-btn-hover-bg: var(--tblr-lime-darken);--tblr-btn-active-color: var(--tblr-lime-fg);--tblr-btn-active-bg: var(--tblr-lime-darken);--tblr-btn-disabled-bg: var(--tblr-lime);--tblr-btn-disabled-color: var(--tblr-lime-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-lime,.btn-outline.btn-lime{--tblr-btn-color: var(--tblr-lime);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-lime);--tblr-btn-hover-color: var(--tblr-lime-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-lime);--tblr-btn-active-color: var(--tblr-lime-fg);--tblr-btn-active-bg: var(--tblr-lime);--tblr-btn-active-border-color: var(--tblr-lime);--tblr-btn-disabled-color: var(--tblr-lime);--tblr-btn-disabled-border-color: var(--tblr-lime)}.btn-ghost-lime,.btn-ghost.btn-lime{--tblr-btn-color: var(--tblr-lime);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-lime-fg);--tblr-btn-hover-bg: var(--tblr-lime);--tblr-btn-hover-border-color: var(--tblr-lime);--tblr-btn-active-color: var(--tblr-lime-fg);--tblr-btn-active-bg: var(--tblr-lime);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-lime);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-green{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-green-fg, #ffffff);--tblr-btn-bg: var(--tblr-green);--tblr-btn-hover-color: var(--tblr-green-fg);--tblr-btn-hover-bg: var(--tblr-green-darken);--tblr-btn-active-color: var(--tblr-green-fg);--tblr-btn-active-bg: var(--tblr-green-darken);--tblr-btn-disabled-bg: var(--tblr-green);--tblr-btn-disabled-color: var(--tblr-green-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-green,.btn-outline.btn-green{--tblr-btn-color: var(--tblr-green);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-green);--tblr-btn-hover-color: var(--tblr-green-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-green);--tblr-btn-active-color: var(--tblr-green-fg);--tblr-btn-active-bg: var(--tblr-green);--tblr-btn-active-border-color: var(--tblr-green);--tblr-btn-disabled-color: var(--tblr-green);--tblr-btn-disabled-border-color: var(--tblr-green)}.btn-ghost-green,.btn-ghost.btn-green{--tblr-btn-color: var(--tblr-green);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-green-fg);--tblr-btn-hover-bg: var(--tblr-green);--tblr-btn-hover-border-color: var(--tblr-green);--tblr-btn-active-color: var(--tblr-green-fg);--tblr-btn-active-bg: var(--tblr-green);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-green);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-teal{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-teal-fg, #ffffff);--tblr-btn-bg: var(--tblr-teal);--tblr-btn-hover-color: var(--tblr-teal-fg);--tblr-btn-hover-bg: var(--tblr-teal-darken);--tblr-btn-active-color: var(--tblr-teal-fg);--tblr-btn-active-bg: var(--tblr-teal-darken);--tblr-btn-disabled-bg: var(--tblr-teal);--tblr-btn-disabled-color: var(--tblr-teal-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-teal,.btn-outline.btn-teal{--tblr-btn-color: var(--tblr-teal);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-teal);--tblr-btn-hover-color: var(--tblr-teal-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-teal);--tblr-btn-active-color: var(--tblr-teal-fg);--tblr-btn-active-bg: var(--tblr-teal);--tblr-btn-active-border-color: var(--tblr-teal);--tblr-btn-disabled-color: var(--tblr-teal);--tblr-btn-disabled-border-color: var(--tblr-teal)}.btn-ghost-teal,.btn-ghost.btn-teal{--tblr-btn-color: var(--tblr-teal);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-teal-fg);--tblr-btn-hover-bg: var(--tblr-teal);--tblr-btn-hover-border-color: var(--tblr-teal);--tblr-btn-active-color: var(--tblr-teal-fg);--tblr-btn-active-bg: var(--tblr-teal);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-teal);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-cyan{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-cyan-fg, #ffffff);--tblr-btn-bg: var(--tblr-cyan);--tblr-btn-hover-color: var(--tblr-cyan-fg);--tblr-btn-hover-bg: var(--tblr-cyan-darken);--tblr-btn-active-color: var(--tblr-cyan-fg);--tblr-btn-active-bg: var(--tblr-cyan-darken);--tblr-btn-disabled-bg: var(--tblr-cyan);--tblr-btn-disabled-color: var(--tblr-cyan-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-cyan,.btn-outline.btn-cyan{--tblr-btn-color: var(--tblr-cyan);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-cyan);--tblr-btn-hover-color: var(--tblr-cyan-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-cyan);--tblr-btn-active-color: var(--tblr-cyan-fg);--tblr-btn-active-bg: var(--tblr-cyan);--tblr-btn-active-border-color: var(--tblr-cyan);--tblr-btn-disabled-color: var(--tblr-cyan);--tblr-btn-disabled-border-color: var(--tblr-cyan)}.btn-ghost-cyan,.btn-ghost.btn-cyan{--tblr-btn-color: var(--tblr-cyan);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-cyan-fg);--tblr-btn-hover-bg: var(--tblr-cyan);--tblr-btn-hover-border-color: var(--tblr-cyan);--tblr-btn-active-color: var(--tblr-cyan-fg);--tblr-btn-active-bg: var(--tblr-cyan);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-cyan);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-x{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-x-fg, #ffffff);--tblr-btn-bg: var(--tblr-x);--tblr-btn-hover-color: var(--tblr-x-fg);--tblr-btn-hover-bg: var(--tblr-x-darken);--tblr-btn-active-color: var(--tblr-x-fg);--tblr-btn-active-bg: var(--tblr-x-darken);--tblr-btn-disabled-bg: var(--tblr-x);--tblr-btn-disabled-color: var(--tblr-x-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-x,.btn-outline.btn-x{--tblr-btn-color: var(--tblr-x);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-x);--tblr-btn-hover-color: var(--tblr-x-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-x);--tblr-btn-active-color: var(--tblr-x-fg);--tblr-btn-active-bg: var(--tblr-x);--tblr-btn-active-border-color: var(--tblr-x);--tblr-btn-disabled-color: var(--tblr-x);--tblr-btn-disabled-border-color: var(--tblr-x)}.btn-ghost-x,.btn-ghost.btn-x{--tblr-btn-color: var(--tblr-x);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-x-fg);--tblr-btn-hover-bg: var(--tblr-x);--tblr-btn-hover-border-color: var(--tblr-x);--tblr-btn-active-color: var(--tblr-x-fg);--tblr-btn-active-bg: var(--tblr-x);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-x);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-facebook{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-facebook-fg, #ffffff);--tblr-btn-bg: var(--tblr-facebook);--tblr-btn-hover-color: var(--tblr-facebook-fg);--tblr-btn-hover-bg: var(--tblr-facebook-darken);--tblr-btn-active-color: var(--tblr-facebook-fg);--tblr-btn-active-bg: var(--tblr-facebook-darken);--tblr-btn-disabled-bg: var(--tblr-facebook);--tblr-btn-disabled-color: var(--tblr-facebook-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-facebook,.btn-outline.btn-facebook{--tblr-btn-color: var(--tblr-facebook);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-facebook);--tblr-btn-hover-color: var(--tblr-facebook-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-facebook);--tblr-btn-active-color: var(--tblr-facebook-fg);--tblr-btn-active-bg: var(--tblr-facebook);--tblr-btn-active-border-color: var(--tblr-facebook);--tblr-btn-disabled-color: var(--tblr-facebook);--tblr-btn-disabled-border-color: var(--tblr-facebook)}.btn-ghost-facebook,.btn-ghost.btn-facebook{--tblr-btn-color: var(--tblr-facebook);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-facebook-fg);--tblr-btn-hover-bg: var(--tblr-facebook);--tblr-btn-hover-border-color: var(--tblr-facebook);--tblr-btn-active-color: var(--tblr-facebook-fg);--tblr-btn-active-bg: var(--tblr-facebook);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-facebook);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-twitter{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-twitter-fg, #ffffff);--tblr-btn-bg: var(--tblr-twitter);--tblr-btn-hover-color: var(--tblr-twitter-fg);--tblr-btn-hover-bg: var(--tblr-twitter-darken);--tblr-btn-active-color: var(--tblr-twitter-fg);--tblr-btn-active-bg: var(--tblr-twitter-darken);--tblr-btn-disabled-bg: var(--tblr-twitter);--tblr-btn-disabled-color: var(--tblr-twitter-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-twitter,.btn-outline.btn-twitter{--tblr-btn-color: var(--tblr-twitter);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-twitter);--tblr-btn-hover-color: var(--tblr-twitter-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-twitter);--tblr-btn-active-color: var(--tblr-twitter-fg);--tblr-btn-active-bg: var(--tblr-twitter);--tblr-btn-active-border-color: var(--tblr-twitter);--tblr-btn-disabled-color: var(--tblr-twitter);--tblr-btn-disabled-border-color: var(--tblr-twitter)}.btn-ghost-twitter,.btn-ghost.btn-twitter{--tblr-btn-color: var(--tblr-twitter);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-twitter-fg);--tblr-btn-hover-bg: var(--tblr-twitter);--tblr-btn-hover-border-color: var(--tblr-twitter);--tblr-btn-active-color: var(--tblr-twitter-fg);--tblr-btn-active-bg: var(--tblr-twitter);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-twitter);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-linkedin{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-linkedin-fg, #ffffff);--tblr-btn-bg: var(--tblr-linkedin);--tblr-btn-hover-color: var(--tblr-linkedin-fg);--tblr-btn-hover-bg: var(--tblr-linkedin-darken);--tblr-btn-active-color: var(--tblr-linkedin-fg);--tblr-btn-active-bg: var(--tblr-linkedin-darken);--tblr-btn-disabled-bg: var(--tblr-linkedin);--tblr-btn-disabled-color: var(--tblr-linkedin-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-linkedin,.btn-outline.btn-linkedin{--tblr-btn-color: var(--tblr-linkedin);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-linkedin);--tblr-btn-hover-color: var(--tblr-linkedin-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-linkedin);--tblr-btn-active-color: var(--tblr-linkedin-fg);--tblr-btn-active-bg: var(--tblr-linkedin);--tblr-btn-active-border-color: var(--tblr-linkedin);--tblr-btn-disabled-color: var(--tblr-linkedin);--tblr-btn-disabled-border-color: var(--tblr-linkedin)}.btn-ghost-linkedin,.btn-ghost.btn-linkedin{--tblr-btn-color: var(--tblr-linkedin);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-linkedin-fg);--tblr-btn-hover-bg: var(--tblr-linkedin);--tblr-btn-hover-border-color: var(--tblr-linkedin);--tblr-btn-active-color: var(--tblr-linkedin-fg);--tblr-btn-active-bg: var(--tblr-linkedin);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-linkedin);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-google{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-google-fg, #ffffff);--tblr-btn-bg: var(--tblr-google);--tblr-btn-hover-color: var(--tblr-google-fg);--tblr-btn-hover-bg: var(--tblr-google-darken);--tblr-btn-active-color: var(--tblr-google-fg);--tblr-btn-active-bg: var(--tblr-google-darken);--tblr-btn-disabled-bg: var(--tblr-google);--tblr-btn-disabled-color: var(--tblr-google-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-google,.btn-outline.btn-google{--tblr-btn-color: var(--tblr-google);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-google);--tblr-btn-hover-color: var(--tblr-google-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-google);--tblr-btn-active-color: var(--tblr-google-fg);--tblr-btn-active-bg: var(--tblr-google);--tblr-btn-active-border-color: var(--tblr-google);--tblr-btn-disabled-color: var(--tblr-google);--tblr-btn-disabled-border-color: var(--tblr-google)}.btn-ghost-google,.btn-ghost.btn-google{--tblr-btn-color: var(--tblr-google);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-google-fg);--tblr-btn-hover-bg: var(--tblr-google);--tblr-btn-hover-border-color: var(--tblr-google);--tblr-btn-active-color: var(--tblr-google-fg);--tblr-btn-active-bg: var(--tblr-google);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-google);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-youtube{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-youtube-fg, #ffffff);--tblr-btn-bg: var(--tblr-youtube);--tblr-btn-hover-color: var(--tblr-youtube-fg);--tblr-btn-hover-bg: var(--tblr-youtube-darken);--tblr-btn-active-color: var(--tblr-youtube-fg);--tblr-btn-active-bg: var(--tblr-youtube-darken);--tblr-btn-disabled-bg: var(--tblr-youtube);--tblr-btn-disabled-color: var(--tblr-youtube-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-youtube,.btn-outline.btn-youtube{--tblr-btn-color: var(--tblr-youtube);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-youtube);--tblr-btn-hover-color: var(--tblr-youtube-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-youtube);--tblr-btn-active-color: var(--tblr-youtube-fg);--tblr-btn-active-bg: var(--tblr-youtube);--tblr-btn-active-border-color: var(--tblr-youtube);--tblr-btn-disabled-color: var(--tblr-youtube);--tblr-btn-disabled-border-color: var(--tblr-youtube)}.btn-ghost-youtube,.btn-ghost.btn-youtube{--tblr-btn-color: var(--tblr-youtube);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-youtube-fg);--tblr-btn-hover-bg: var(--tblr-youtube);--tblr-btn-hover-border-color: var(--tblr-youtube);--tblr-btn-active-color: var(--tblr-youtube-fg);--tblr-btn-active-bg: var(--tblr-youtube);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-youtube);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-vimeo{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-vimeo-fg, #ffffff);--tblr-btn-bg: var(--tblr-vimeo);--tblr-btn-hover-color: var(--tblr-vimeo-fg);--tblr-btn-hover-bg: var(--tblr-vimeo-darken);--tblr-btn-active-color: var(--tblr-vimeo-fg);--tblr-btn-active-bg: var(--tblr-vimeo-darken);--tblr-btn-disabled-bg: var(--tblr-vimeo);--tblr-btn-disabled-color: var(--tblr-vimeo-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-vimeo,.btn-outline.btn-vimeo{--tblr-btn-color: var(--tblr-vimeo);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-vimeo);--tblr-btn-hover-color: var(--tblr-vimeo-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-vimeo);--tblr-btn-active-color: var(--tblr-vimeo-fg);--tblr-btn-active-bg: var(--tblr-vimeo);--tblr-btn-active-border-color: var(--tblr-vimeo);--tblr-btn-disabled-color: var(--tblr-vimeo);--tblr-btn-disabled-border-color: var(--tblr-vimeo)}.btn-ghost-vimeo,.btn-ghost.btn-vimeo{--tblr-btn-color: var(--tblr-vimeo);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-vimeo-fg);--tblr-btn-hover-bg: var(--tblr-vimeo);--tblr-btn-hover-border-color: var(--tblr-vimeo);--tblr-btn-active-color: var(--tblr-vimeo-fg);--tblr-btn-active-bg: var(--tblr-vimeo);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-vimeo);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-dribbble{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-dribbble-fg, #ffffff);--tblr-btn-bg: var(--tblr-dribbble);--tblr-btn-hover-color: var(--tblr-dribbble-fg);--tblr-btn-hover-bg: var(--tblr-dribbble-darken);--tblr-btn-active-color: var(--tblr-dribbble-fg);--tblr-btn-active-bg: var(--tblr-dribbble-darken);--tblr-btn-disabled-bg: var(--tblr-dribbble);--tblr-btn-disabled-color: var(--tblr-dribbble-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-dribbble,.btn-outline.btn-dribbble{--tblr-btn-color: var(--tblr-dribbble);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-dribbble);--tblr-btn-hover-color: var(--tblr-dribbble-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-dribbble);--tblr-btn-active-color: var(--tblr-dribbble-fg);--tblr-btn-active-bg: var(--tblr-dribbble);--tblr-btn-active-border-color: var(--tblr-dribbble);--tblr-btn-disabled-color: var(--tblr-dribbble);--tblr-btn-disabled-border-color: var(--tblr-dribbble)}.btn-ghost-dribbble,.btn-ghost.btn-dribbble{--tblr-btn-color: var(--tblr-dribbble);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-dribbble-fg);--tblr-btn-hover-bg: var(--tblr-dribbble);--tblr-btn-hover-border-color: var(--tblr-dribbble);--tblr-btn-active-color: var(--tblr-dribbble-fg);--tblr-btn-active-bg: var(--tblr-dribbble);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-dribbble);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-github{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-github-fg, #ffffff);--tblr-btn-bg: var(--tblr-github);--tblr-btn-hover-color: var(--tblr-github-fg);--tblr-btn-hover-bg: var(--tblr-github-darken);--tblr-btn-active-color: var(--tblr-github-fg);--tblr-btn-active-bg: var(--tblr-github-darken);--tblr-btn-disabled-bg: var(--tblr-github);--tblr-btn-disabled-color: var(--tblr-github-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-github,.btn-outline.btn-github{--tblr-btn-color: var(--tblr-github);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-github);--tblr-btn-hover-color: var(--tblr-github-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-github);--tblr-btn-active-color: var(--tblr-github-fg);--tblr-btn-active-bg: var(--tblr-github);--tblr-btn-active-border-color: var(--tblr-github);--tblr-btn-disabled-color: var(--tblr-github);--tblr-btn-disabled-border-color: var(--tblr-github)}.btn-ghost-github,.btn-ghost.btn-github{--tblr-btn-color: var(--tblr-github);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-github-fg);--tblr-btn-hover-bg: var(--tblr-github);--tblr-btn-hover-border-color: var(--tblr-github);--tblr-btn-active-color: var(--tblr-github-fg);--tblr-btn-active-bg: var(--tblr-github);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-github);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-instagram{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-instagram-fg, #ffffff);--tblr-btn-bg: var(--tblr-instagram);--tblr-btn-hover-color: var(--tblr-instagram-fg);--tblr-btn-hover-bg: var(--tblr-instagram-darken);--tblr-btn-active-color: var(--tblr-instagram-fg);--tblr-btn-active-bg: var(--tblr-instagram-darken);--tblr-btn-disabled-bg: var(--tblr-instagram);--tblr-btn-disabled-color: var(--tblr-instagram-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-instagram,.btn-outline.btn-instagram{--tblr-btn-color: var(--tblr-instagram);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-instagram);--tblr-btn-hover-color: var(--tblr-instagram-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-instagram);--tblr-btn-active-color: var(--tblr-instagram-fg);--tblr-btn-active-bg: var(--tblr-instagram);--tblr-btn-active-border-color: var(--tblr-instagram);--tblr-btn-disabled-color: var(--tblr-instagram);--tblr-btn-disabled-border-color: var(--tblr-instagram)}.btn-ghost-instagram,.btn-ghost.btn-instagram{--tblr-btn-color: var(--tblr-instagram);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-instagram-fg);--tblr-btn-hover-bg: var(--tblr-instagram);--tblr-btn-hover-border-color: var(--tblr-instagram);--tblr-btn-active-color: var(--tblr-instagram-fg);--tblr-btn-active-bg: var(--tblr-instagram);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-instagram);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-pinterest{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-pinterest-fg, #ffffff);--tblr-btn-bg: var(--tblr-pinterest);--tblr-btn-hover-color: var(--tblr-pinterest-fg);--tblr-btn-hover-bg: var(--tblr-pinterest-darken);--tblr-btn-active-color: var(--tblr-pinterest-fg);--tblr-btn-active-bg: var(--tblr-pinterest-darken);--tblr-btn-disabled-bg: var(--tblr-pinterest);--tblr-btn-disabled-color: var(--tblr-pinterest-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-pinterest,.btn-outline.btn-pinterest{--tblr-btn-color: var(--tblr-pinterest);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-pinterest);--tblr-btn-hover-color: var(--tblr-pinterest-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-pinterest);--tblr-btn-active-color: var(--tblr-pinterest-fg);--tblr-btn-active-bg: var(--tblr-pinterest);--tblr-btn-active-border-color: var(--tblr-pinterest);--tblr-btn-disabled-color: var(--tblr-pinterest);--tblr-btn-disabled-border-color: var(--tblr-pinterest)}.btn-ghost-pinterest,.btn-ghost.btn-pinterest{--tblr-btn-color: var(--tblr-pinterest);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-pinterest-fg);--tblr-btn-hover-bg: var(--tblr-pinterest);--tblr-btn-hover-border-color: var(--tblr-pinterest);--tblr-btn-active-color: var(--tblr-pinterest-fg);--tblr-btn-active-bg: var(--tblr-pinterest);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-pinterest);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-vk{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-vk-fg, #ffffff);--tblr-btn-bg: var(--tblr-vk);--tblr-btn-hover-color: var(--tblr-vk-fg);--tblr-btn-hover-bg: var(--tblr-vk-darken);--tblr-btn-active-color: var(--tblr-vk-fg);--tblr-btn-active-bg: var(--tblr-vk-darken);--tblr-btn-disabled-bg: var(--tblr-vk);--tblr-btn-disabled-color: var(--tblr-vk-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-vk,.btn-outline.btn-vk{--tblr-btn-color: var(--tblr-vk);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-vk);--tblr-btn-hover-color: var(--tblr-vk-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-vk);--tblr-btn-active-color: var(--tblr-vk-fg);--tblr-btn-active-bg: var(--tblr-vk);--tblr-btn-active-border-color: var(--tblr-vk);--tblr-btn-disabled-color: var(--tblr-vk);--tblr-btn-disabled-border-color: var(--tblr-vk)}.btn-ghost-vk,.btn-ghost.btn-vk{--tblr-btn-color: var(--tblr-vk);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-vk-fg);--tblr-btn-hover-bg: var(--tblr-vk);--tblr-btn-hover-border-color: var(--tblr-vk);--tblr-btn-active-color: var(--tblr-vk-fg);--tblr-btn-active-bg: var(--tblr-vk);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-vk);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-rss{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-rss-fg, #ffffff);--tblr-btn-bg: var(--tblr-rss);--tblr-btn-hover-color: var(--tblr-rss-fg);--tblr-btn-hover-bg: var(--tblr-rss-darken);--tblr-btn-active-color: var(--tblr-rss-fg);--tblr-btn-active-bg: var(--tblr-rss-darken);--tblr-btn-disabled-bg: var(--tblr-rss);--tblr-btn-disabled-color: var(--tblr-rss-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-rss,.btn-outline.btn-rss{--tblr-btn-color: var(--tblr-rss);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-rss);--tblr-btn-hover-color: var(--tblr-rss-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-rss);--tblr-btn-active-color: var(--tblr-rss-fg);--tblr-btn-active-bg: var(--tblr-rss);--tblr-btn-active-border-color: var(--tblr-rss);--tblr-btn-disabled-color: var(--tblr-rss);--tblr-btn-disabled-border-color: var(--tblr-rss)}.btn-ghost-rss,.btn-ghost.btn-rss{--tblr-btn-color: var(--tblr-rss);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-rss-fg);--tblr-btn-hover-bg: var(--tblr-rss);--tblr-btn-hover-border-color: var(--tblr-rss);--tblr-btn-active-color: var(--tblr-rss-fg);--tblr-btn-active-bg: var(--tblr-rss);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-rss);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-flickr{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-flickr-fg, #ffffff);--tblr-btn-bg: var(--tblr-flickr);--tblr-btn-hover-color: var(--tblr-flickr-fg);--tblr-btn-hover-bg: var(--tblr-flickr-darken);--tblr-btn-active-color: var(--tblr-flickr-fg);--tblr-btn-active-bg: var(--tblr-flickr-darken);--tblr-btn-disabled-bg: var(--tblr-flickr);--tblr-btn-disabled-color: var(--tblr-flickr-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-flickr,.btn-outline.btn-flickr{--tblr-btn-color: var(--tblr-flickr);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-flickr);--tblr-btn-hover-color: var(--tblr-flickr-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-flickr);--tblr-btn-active-color: var(--tblr-flickr-fg);--tblr-btn-active-bg: var(--tblr-flickr);--tblr-btn-active-border-color: var(--tblr-flickr);--tblr-btn-disabled-color: var(--tblr-flickr);--tblr-btn-disabled-border-color: var(--tblr-flickr)}.btn-ghost-flickr,.btn-ghost.btn-flickr{--tblr-btn-color: var(--tblr-flickr);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-flickr-fg);--tblr-btn-hover-bg: var(--tblr-flickr);--tblr-btn-hover-border-color: var(--tblr-flickr);--tblr-btn-active-color: var(--tblr-flickr-fg);--tblr-btn-active-bg: var(--tblr-flickr);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-flickr);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-bitbucket{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-bitbucket-fg, #ffffff);--tblr-btn-bg: var(--tblr-bitbucket);--tblr-btn-hover-color: var(--tblr-bitbucket-fg);--tblr-btn-hover-bg: var(--tblr-bitbucket-darken);--tblr-btn-active-color: var(--tblr-bitbucket-fg);--tblr-btn-active-bg: var(--tblr-bitbucket-darken);--tblr-btn-disabled-bg: var(--tblr-bitbucket);--tblr-btn-disabled-color: var(--tblr-bitbucket-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-bitbucket,.btn-outline.btn-bitbucket{--tblr-btn-color: var(--tblr-bitbucket);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-bitbucket);--tblr-btn-hover-color: var(--tblr-bitbucket-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-bitbucket);--tblr-btn-active-color: var(--tblr-bitbucket-fg);--tblr-btn-active-bg: var(--tblr-bitbucket);--tblr-btn-active-border-color: var(--tblr-bitbucket);--tblr-btn-disabled-color: var(--tblr-bitbucket);--tblr-btn-disabled-border-color: var(--tblr-bitbucket)}.btn-ghost-bitbucket,.btn-ghost.btn-bitbucket{--tblr-btn-color: var(--tblr-bitbucket);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-bitbucket-fg);--tblr-btn-hover-bg: var(--tblr-bitbucket);--tblr-btn-hover-border-color: var(--tblr-bitbucket);--tblr-btn-active-color: var(--tblr-bitbucket-fg);--tblr-btn-active-bg: var(--tblr-bitbucket);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-bitbucket);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-tabler{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-tabler-fg, #ffffff);--tblr-btn-bg: var(--tblr-tabler);--tblr-btn-hover-color: var(--tblr-tabler-fg);--tblr-btn-hover-bg: var(--tblr-tabler-darken);--tblr-btn-active-color: var(--tblr-tabler-fg);--tblr-btn-active-bg: var(--tblr-tabler-darken);--tblr-btn-disabled-bg: var(--tblr-tabler);--tblr-btn-disabled-color: var(--tblr-tabler-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-tabler,.btn-outline.btn-tabler{--tblr-btn-color: var(--tblr-tabler);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-tabler);--tblr-btn-hover-color: var(--tblr-tabler-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-tabler);--tblr-btn-active-color: var(--tblr-tabler-fg);--tblr-btn-active-bg: var(--tblr-tabler);--tblr-btn-active-border-color: var(--tblr-tabler);--tblr-btn-disabled-color: var(--tblr-tabler);--tblr-btn-disabled-border-color: var(--tblr-tabler)}.btn-ghost-tabler,.btn-ghost.btn-tabler{--tblr-btn-color: var(--tblr-tabler);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-tabler-fg);--tblr-btn-hover-bg: var(--tblr-tabler);--tblr-btn-hover-border-color: var(--tblr-tabler);--tblr-btn-active-color: var(--tblr-tabler-fg);--tblr-btn-active-bg: var(--tblr-tabler);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-tabler);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-sm,.btn-group-sm>.btn{--tblr-btn-line-height: 1.3333333333;--tblr-btn-icon-size: 1rem}.btn-lg,.btn-group-lg>.btn{--tblr-btn-line-height: 1.5rem;--tblr-btn-icon-size: 1.5rem}.btn-xl,.btn-group-xl>.btn{--tblr-btn-line-height: 2;--tblr-btn-icon-size: 2rem;--tblr-btn-padding-y: .6875rem;--tblr-btn-padding-x: 2rem;--tblr-btn-font-size: 1.5rem}.btn-pill{padding-right:1.5em;padding-left:1.5em;border-radius:10rem}.btn-pill[class*=btn-icon]{padding:.375rem 15px}.btn-square{border-radius:0}.btn-icon,.btn-action{padding-left:0;padding-right:0}.btn-icon .icon,.btn-action .icon{margin:calc(-1 * var(--tblr-btn-padding-x))}.btn-list{--tblr-list-gap: .5rem;display:flex;flex-wrap:wrap;gap:var(--tblr-list-gap)}.btn-floating{position:fixed;z-index:1030;bottom:1rem;left:1rem;box-shadow:var(--tblr-shadow-dropdown)}.btn-loading{position:relative;color:transparent!important;text-shadow:none!important;pointer-events:none}.btn-loading>*{opacity:0}.btn-loading:after{content:"";display:inline-block;vertical-align:text-bottom;border:2px var(--tblr-border-style) currentColor;border-right-color:transparent;border-radius:100rem;color:var(--tblr-btn-color);position:absolute;width:var(--tblr-btn-icon-size);height:var(--tblr-btn-icon-size);left:calc(50% - var(--tblr-btn-icon-size) / 2);top:calc(50% - var(--tblr-btn-icon-size) / 2);animation:spinner-border .75s linear infinite}.btn-action{--tblr-border-color: transparent;color:var(--tblr-secondary);border-radius:var(--tblr-border-radius);background:transparent;box-shadow:none}.btn-action:after{content:none}.btn-action:focus{outline:none;box-shadow:none}.btn-action:hover,.btn-action.show{color:var(--tblr-body-color);background:var(--tblr-active-bg);border-color:transparent}.btn-action.show{color:var(--tblr-primary)}.btn-actions{display:flex}.btn-animate-icon .icon{transition:transform .3s ease}.btn-animate-icon:hover .icon,.btn-animate-icon:focus-visible .icon{transform:translate(4px)}.btn-animate-icon.btn-animate-icon-rotate:hover .icon,.btn-animate-icon.btn-animate-icon-rotate:focus-visible .icon{transform:rotate(90deg)}.btn-animate-icon.btn-animate-icon-move-start:hover .icon,.btn-animate-icon.btn-animate-icon-move-start:focus-visible .icon{transform:translate(-4px)}.btn-animate-icon.btn-animate-icon-pulse:hover .icon,.btn-animate-icon.btn-animate-icon-pulse:focus-visible .icon{transform:none;animation:pulse .9s}.btn-animate-icon.btn-animate-icon-shake:hover .icon,.btn-animate-icon.btn-animate-icon-shake:focus-visible .icon{transform:none;animation:shake .9s}.btn-animate-icon.btn-animate-icon-tada:hover .icon,.btn-animate-icon.btn-animate-icon-tada:focus-visible .icon{transform:none;animation:tada .9s}.btn-group,.btn-group-vertical{box-shadow:var(--tblr-shadow-input)}.btn-group>.btn-check:checked+.btn,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:5}.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus{z-index:1}.calendar{display:block;font-size:.765625rem;border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);border-radius:var(--tblr-border-radius)}.calendar-nav{display:flex;align-items:center}.calendar-title{flex:1;text-align:center}.calendar-body,.calendar-header{display:flex;flex-wrap:wrap;justify-content:flex-start;padding:.5rem 0}.calendar-header{color:var(--tblr-secondary)}.calendar-date{flex:0 0 14.2857142857%;max-width:14.2857142857%;padding:.2rem;text-align:center;border:0}.calendar-date.prev-month,.calendar-date.next-month{opacity:.25}.calendar-date .date-item{position:relative;display:inline-block;width:1.4rem;height:1.4rem;line-height:1.4rem;color:#66758c;text-align:center;text-decoration:none;white-space:nowrap;vertical-align:middle;cursor:pointer;background:0 0;border:var(--tblr-border-width) var(--tblr-border-style) transparent;border-radius:100rem;outline:0;transition:background .3s,border .3s,box-shadow .32s,color .3s}@media(prefers-reduced-motion:reduce){.calendar-date .date-item{transition:none}}.calendar-date .date-item:hover{color:var(--tblr-primary);text-decoration:none;background:#fefeff;border-color:var(--tblr-border-color)}.calendar-date .date-today{color:var(--tblr-primary);border-color:var(--tblr-border-color)}.calendar-range{position:relative}.calendar-range:before{position:absolute;top:50%;right:0;left:0;height:1.4rem;content:"";background:rgba(var(--tblr-primary-rgb),.1);transform:translateY(-50%)}.calendar-range.range-start .date-item,.calendar-range.range-end .date-item{color:#fff;background:var(--tblr-primary);border-color:var(--tblr-primary)}.calendar-range.range-start:before{left:50%}.calendar-range.range-end:before{right:50%}.carousel-indicators-vertical{left:auto;top:0;margin:0 1rem 0 0;flex-direction:column}.carousel-indicators-vertical [data-bs-target]{margin:3px 0;width:3px;height:30px;border:0;border-left:10px var(--tblr-border-style) transparent;border-right:10px var(--tblr-border-style) transparent}.carousel-indicators-dot [data-bs-target]{width:.5rem;height:.5rem;border-radius:100rem;border:10px var(--tblr-border-style) transparent;margin:0}.carousel-indicators-thumb [data-bs-target]{width:2rem;height:auto;background:no-repeat center/cover;border:0;border-radius:var(--tblr-border-radius);box-shadow:rgba(var(--tblr-body-color-rgb),.04) 0 2px 4px;margin:0 3px;opacity:.75}@media(min-width:992px){.carousel-indicators-thumb [data-bs-target]{width:4rem}}.carousel-indicators-thumb [data-bs-target]:before{content:"";padding-top:var(--tblr-aspect-ratio, 100%);display:block}.carousel-indicators-thumb.carousel-indicators-vertical [data-bs-target]{margin:3px 0}.carousel-caption-background{background:red;position:absolute;left:0;right:0;bottom:0;height:90%;background:linear-gradient(0deg,#1f2937e6,#1f293700)}.card{transition:transform .3s ease-out,opacity .3s ease-out,box-shadow .3s ease-out}@media(prefers-reduced-motion:reduce){.card{transition:none}}@media print{.card{border:none;box-shadow:none}}a.card{color:inherit}a.card:hover{text-decoration:none;box-shadow:rgba(var(--tblr-body-color-rgb),.16) 0 2px 16px}.card .card{box-shadow:none}.card-borderless,.card-borderless .card-header,.card-borderless .card-footer{border-color:transparent}.card-stamp{--tblr-stamp-size: 7rem;position:absolute;top:0;right:0;width:calc(var(--tblr-stamp-size) * 1);height:calc(var(--tblr-stamp-size) * 1);max-height:100%;border-top-right-radius:6px;opacity:.2;overflow:hidden;pointer-events:none}.card-stamp-lg{--tblr-stamp-size: 13rem}.card-stamp-icon{background:var(--tblr-secondary);color:var(--tblr-card-bg, var(--tblr-bg-surface));display:flex;align-items:center;justify-content:center;border-radius:100rem;width:calc(var(--tblr-stamp-size) * 1);height:calc(var(--tblr-stamp-size) * 1);position:relative;top:calc(var(--tblr-stamp-size) * -.25);right:calc(var(--tblr-stamp-size) * -.25);font-size:calc(var(--tblr-stamp-size) * .75);transform:rotate(10deg)}.card-stamp-icon .icon{stroke-width:2;width:calc(var(--tblr-stamp-size) * .75);height:calc(var(--tblr-stamp-size) * .75)}.card-img,.card-img-start{border-top-left-radius:calc(var(--tblr-border-radius-lg) - (var(--tblr-border-width)));border-bottom-left-radius:calc(var(--tblr-border-radius-lg) - (var(--tblr-border-width)))}.card-img,.card-img-end{border-top-right-radius:calc(var(--tblr-border-radius-lg) - (var(--tblr-border-width)));border-bottom-right-radius:calc(var(--tblr-border-radius-lg) - (var(--tblr-border-width)))}.card-img-overlay{display:flex;flex-direction:column;justify-content:flex-end}.card-img-overlay-dark{background-image:linear-gradient(180deg,#0000,#0009)}.card-inactive{pointer-events:none;box-shadow:none}.card-inactive .card-body{opacity:.64}.card-active{--tblr-card-border-color: var(--tblr-primary);--tblr-card-bg: var(--tblr-active-bg)}.card-btn{display:flex;align-items:center;justify-content:center;padding:1rem 1.25rem;text-align:center;transition:background .3s}@media(prefers-reduced-motion:reduce){.card-btn{transition:none}}.card-btn{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);flex:1;color:inherit;font-weight:var(--tblr-font-weight-medium)}.card-btn:hover{text-decoration:none;background:rgba(var(--tblr-primary-rgb),.04)}.card-btn+.card-btn{border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.card-stacked{--tblr-card-stacked-offset: .25rem;position:relative}.card-stacked:after{position:absolute;top:calc(-1 * var(--tblr-card-stacked-offset));right:var(--tblr-card-stacked-offset);left:var(--tblr-card-stacked-offset);height:var(--tblr-card-stacked-offset);content:"";background:var(--tblr-card-bg, var(--tblr-bg-surface));border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-card-border-color);border-radius:var(--tblr-card-border-radius) var(--tblr-card-border-radius) 0 0}.card-cover{position:relative;padding:1rem 1.25rem;background:#666 no-repeat center/cover}.card-cover:before{position:absolute;inset:0;content:"";background:#1f29377a}.card-cover:first-child,.card-cover:first-child:before{border-radius:6px 6px 0 0}.card-cover-blurred:before{backdrop-filter:blur(2px)}.card-actions{margin:-.5rem -.5rem -.5rem auto;padding-left:.5rem}.card-actions a{text-decoration:none}.card-header{color:inherit;display:flex;align-items:center;background:transparent}.card-header:first-child{border-radius:var(--tblr-card-border-radius) var(--tblr-card-border-radius) 0 0}.card-header-light{border-bottom-color:transparent;background:var(--tblr-bg-surface-tertiary)}.card-header-tabs{background:var(--tblr-bg-surface-tertiary);flex:1;margin:calc(var(--tblr-card-cap-padding-y) * -1) calc(var(--tblr-card-cap-padding-x) * -1) calc(var(--tblr-card-cap-padding-y) * -1);padding:calc(var(--tblr-card-cap-padding-y) * .5) calc(var(--tblr-card-cap-padding-x) * .5) 0;border-radius:var(--tblr-card-border-radius) var(--tblr-card-border-radius) 0 0}.card-header-pills{flex:1;margin-top:-.5rem;margin-bottom:-.5rem}.card-rotate-left,.card-rotate-start{transform:rotate(-1.5deg)}.card-rotate-right,.card-rotate-end{transform:rotate(1.5deg)}.card-link{color:inherit}.card-link:hover{color:inherit;text-decoration:none;box-shadow:0 1px 6px #00000014}.card-link-rotate:hover{transform:rotate(1.5deg);opacity:1}.card-link-pop:hover{transform:translateY(-2px);opacity:1}.card-footer{margin-top:auto}.card-footer:last-child{border-radius:0 0 var(--tblr-card-border-radius) var(--tblr-card-border-radius)}.card-footer-transparent{background:transparent;border-color:transparent;padding-top:0}.card-footer-borderless{border-top:none}.card-progress{height:.25rem}.card-progress:last-child{border-radius:0 0 2px 2px}.card-progress:first-child{border-radius:2px 2px 0 0}.card-meta{color:var(--tblr-secondary)}.card-title{display:block;margin:0 0 1rem;font-size:1rem;font-weight:var(--tblr-font-weight-medium);color:inherit;line-height:1.5rem}a.card-title:hover{color:inherit}.card-header .card-title{margin:0}.card-subtitle{margin-bottom:1.25rem;color:var(--tblr-secondary);font-weight:400}.card-header .card-subtitle{margin:0}.card-title .card-subtitle{margin:0 0 0 .25rem;font-size:.875rem}.card-body{position:relative}.card-body>:last-child{margin-bottom:0}.card-sm>.card-body{padding:1rem}@media(min-width:768px){.card-md>.card-body{padding:2.5rem}}@media(min-width:768px){.card-lg>.card-body{padding:2rem}}@media(min-width:992px){.card-lg>.card-body{padding:4rem}}@media print{.card-body{padding:0}}.card-body+.card-body{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.card-body-scrollable{overflow:auto}.card-options{top:1.5rem;right:.75rem;display:flex;margin-left:auto}.card-options-link{display:inline-block;min-width:1rem;margin-left:.25rem;color:var(--tblr-secondary)}.card-status-top{position:absolute;top:0;right:0;left:0;height:2px;border-radius:var(--tblr-card-border-radius) var(--tblr-card-border-radius) 0 0}.card-status-start{position:absolute;right:auto;bottom:0;width:2px;height:100%;border-radius:var(--tblr-card-border-radius) 0 0 var(--tblr-card-border-radius)}.card-status-bottom{position:absolute;top:initial;bottom:0;width:100%;height:2px;border-radius:0 0 var(--tblr-card-border-radius) var(--tblr-card-border-radius)}.card-table{margin-bottom:0!important}.card-table tr td:first-child,.card-table tr th:first-child{padding-left:1.25rem;border-left:0}.card-table tr td:last-child,.card-table tr th:last-child{padding-right:1.25rem;border-right:0}.card-table thead tr:first-child,.card-table tbody tr:first-child,.card-table tfoot tr:first-child,.card-table thead tr:first-child td,.card-table thead tr:first-child th,.card-table tbody tr:first-child td,.card-table tbody tr:first-child th,.card-table tfoot tr:first-child td,.card-table tfoot tr:first-child th{border-top:0}.card-body+.card-table{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-table-border-color)}.card-code{padding:0}.card-code .highlight{margin:0;border:0}.card-code pre{margin:0!important;border:0!important}.card-chart{position:relative;z-index:1;height:3.5rem}.card-avatar{margin-left:auto;margin-right:auto;box-shadow:0 0 0 .25rem var(--tblr-card-bg, var(--tblr-bg-surface));margin-top:calc(-1 * var(--tblr-avatar-size) * .5)}.card-body+.card-list-group{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.card-list-group .list-group-item{padding-right:1.25rem;padding-left:1.25rem;border-right:0;border-left:0;border-radius:0}.card-list-group .list-group-item:last-child{border-bottom:0}.card-list-group .list-group-item:first-child{border-top:0}.card-tabs .nav-tabs{position:relative;z-index:1000;border-bottom:0}.card-tabs .nav-tabs .nav-link{background:var(--tblr-bg-surface-tertiary);border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)}.card-tabs .nav-tabs .nav-link.active,.card-tabs .nav-tabs .nav-link:active,.card-tabs .nav-tabs .nav-link:hover{border-color:var(--tblr-border-color-translucent);color:var(--tblr-body-color)}.card-tabs .nav-tabs .nav-link.active{color:inherit;background:var(--tblr-card-bg, var(--tblr-bg-surface));border-bottom-color:transparent}.card-tabs .nav-tabs .nav-item:not(:first-child) .nav-link{border-top-left-radius:0}.card-tabs .nav-tabs .nav-item:not(:last-child) .nav-link{border-top-right-radius:0}.card-tabs .nav-tabs .nav-item+.nav-item{margin-left:calc(-1 * var(--tblr-border-width))}.card-tabs .nav-tabs-bottom,.card-tabs .nav-tabs-bottom .nav-link{margin-bottom:0}.card-tabs .nav-tabs-bottom .nav-link.active{border-top-color:transparent}.card-tabs .nav-tabs-bottom .nav-item{margin-top:calc(-1 * var(--tblr-border-width));margin-bottom:0}.card-tabs .nav-tabs-bottom .nav-item .nav-link{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent);border-radius:0 0 var(--tblr-border-radius-lg) var(--tblr-border-radius-lg)}.card-tabs .nav-tabs-bottom .nav-item:not(:first-child) .nav-link{border-bottom-left-radius:0}.card-tabs .nav-tabs-bottom .nav-item:not(:last-child) .nav-link{border-bottom-right-radius:0}.card-tabs .card{border-bottom-left-radius:0}.card-tabs .nav-tabs+.tab-content .card{border-bottom-left-radius:var(--tblr-card-border-radius);border-top-left-radius:0}.card-note{--tblr-card-bg: #fff7dd;--tblr-card-border-color: #fff1c9}.btn-close{--tblr-btn-close-color: currentColor;--tblr-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%231f2937'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414'/%3e%3c/svg%3e");--tblr-btn-close-opacity: .4;--tblr-btn-close-hover-opacity: .75;--tblr-btn-close-focus-shadow: 0 0 0 .25rem rgba(var(--tblr-primary-rgb), .25);--tblr-btn-close-focus-opacity: 1;--tblr-btn-close-disabled-opacity: .25;--tblr-btn-close-size: 1em;width:var(--tblr-btn-close-size);height:var(--tblr-btn-close-size);padding:.25em;color:var(--tblr-btn-close-color);mask:var(--tblr-btn-close-bg) no-repeat center/calc(var(--tblr-btn-close-size) * .75);background-color:var(--tblr-btn-close-color);border:0;border-radius:var(--tblr-border-radius);opacity:var(--tblr-btn-close-opacity);cursor:pointer;display:block}.btn-close:hover{color:var(--tblr-btn-close-color);text-decoration:none;opacity:var(--tblr-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--tblr-btn-close-focus-shadow);opacity:var(--tblr-btn-close-focus-opacity)}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;opacity:var(--tblr-btn-close-disabled-opacity)}.dropdown-menu{user-select:none;background-clip:border-box}.dropdown-menu.card{padding:0;min-width:25rem;display:none}.dropdown-menu.card.show{display:flex}.dropdown-item{min-width:11rem;display:flex;align-items:center;margin:0;line-height:1.4285714286;gap:.5rem}.dropdown-item-icon{width:1.25rem!important;height:1.25rem!important;margin-right:.5rem;color:var(--tblr-secondary);opacity:.7;text-align:center}.dropdown-item-indicator{margin-right:.5rem;margin-left:-.25rem;height:1.25rem;display:inline-flex;line-height:1;vertical-align:bottom;align-items:center}.dropdown-header{font-size:.75rem;font-weight:var(--tblr-font-weight-medium);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);padding-bottom:.25rem;pointer-events:none}.dropdown-menu-scrollable{height:auto;max-height:13rem;overflow-x:hidden}.dropdown-menu-column{min-width:11rem}.dropdown-menu-column .dropdown-item{min-width:0}.dropdown-menu-columns{display:flex;flex:0 .25rem}.dropdown-menu-arrow:before{content:"";position:absolute;top:-.25rem;left:.75rem;display:block;background:inherit;width:14px;height:14px;transform:rotate(45deg);transform-origin:center;border:1px solid;border-color:inherit;z-index:-1;clip:rect(0px,9px,9px,0px)}.dropdown-menu-arrow.dropdown-menu-end:before{right:.75rem;left:auto}.dropend>.dropdown-menu{margin-top:calc(-.25rem - 1px);margin-left:-.25rem}.dropend .dropdown-toggle:after{margin-left:auto}.dropdown-menu-card{padding:0;min-width:20rem}.dropdown-menu-card>.card{margin:0;border:0;box-shadow:none}.datagrid{--tblr-datagrid-padding: 1.5rem;--tblr-datagrid-item-width: 15rem;display:grid;grid-gap:var(--tblr-datagrid-padding);grid-template-columns:repeat(auto-fit,minmax(var(--tblr-datagrid-item-width),1fr))}.datagrid-title{font-size:.75rem;font-weight:var(--tblr-font-weight-medium);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);margin-bottom:.25rem}.empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;padding:1rem;text-align:center}@media(min-width:768px){.empty{padding:3rem}}.empty-icon{margin:0 0 1rem;width:3rem;height:3rem;line-height:1;color:var(--tblr-secondary)}.empty-icon svg{width:100%;height:100%}.empty-img{margin:0 0 2rem;line-height:1}.empty-header{margin:0 0 1rem;font-size:4rem;font-weight:var(--tblr-font-weight-light);line-height:1;color:var(--tblr-secondary)}.empty-title{font-size:1.25rem;line-height:1.75rem;font-weight:var(--tblr-font-weight-bold)}.empty-title,.empty-subtitle{margin:0 0 .5rem}.empty-action{margin-top:1.5rem}.empty-bordered{border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);border-radius:var(--tblr-border-radius)}.row>*{min-width:0}.col-separator{border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.container-slim{--tblr-gutter-x: calc(var(--tblr-page-padding) * 2);--tblr-gutter-y: 0;width:100%;padding-right:calc(var(--tblr-gutter-x) * .5);padding-left:calc(var(--tblr-gutter-x) * .5);margin-right:auto;margin-left:auto;max-width:16rem}.container-tight{--tblr-gutter-x: calc(var(--tblr-page-padding) * 2);--tblr-gutter-y: 0;width:100%;padding-right:calc(var(--tblr-gutter-x) * .5);padding-left:calc(var(--tblr-gutter-x) * .5);margin-right:auto;margin-left:auto;max-width:30rem}.container-narrow{--tblr-gutter-x: calc(var(--tblr-page-padding) * 2);--tblr-gutter-y: 0;width:100%;padding-right:calc(var(--tblr-gutter-x) * .5);padding-left:calc(var(--tblr-gutter-x) * .5);margin-right:auto;margin-left:auto;max-width:61.875rem}.row-0{margin-right:0;margin-left:0}.row-0>.col,.row-0>[class*=col-]{padding-right:0;padding-left:0}.row-0 .card{margin-bottom:0}.row-sm{margin-right:-.375rem;margin-left:-.375rem}.row-sm>.col,.row-sm>[class*=col-]{padding-right:.375rem;padding-left:.375rem}.row-sm .card{margin-bottom:.75rem}.row-md{margin-right:-1.5rem;margin-left:-1.5rem}.row-md>.col,.row-md>[class*=col-]{padding-right:1.5rem;padding-left:1.5rem}.row-md .card{margin-bottom:3rem}.row-lg{margin-right:-3rem;margin-left:-3rem}.row-lg>.col,.row-lg>[class*=col-]{padding-right:3rem;padding-left:3rem}.row-lg .card{margin-bottom:6rem}.row-deck>.col,.row-deck>[class*=col-]{display:flex;align-items:stretch}.row-deck>.col .card,.row-deck>[class*=col-] .card{flex:1 1 auto}.row-cards{--tblr-gutter-x: var(--tblr-page-padding);--tblr-gutter-y: var(--tblr-page-padding);min-width:0}.row-cards .row-cards{flex:1}.space-y{display:flex;flex-direction:column;gap:1rem}.space-x{display:flex;gap:1rem}.space-y-0{display:flex;flex-direction:column;gap:0}.space-x-0{display:flex;gap:0}.space-y-1{display:flex;flex-direction:column;gap:.25rem}.space-x-1{display:flex;gap:.25rem}.space-y-2{display:flex;flex-direction:column;gap:.5rem}.space-x-2{display:flex;gap:.5rem}.space-y-3{display:flex;flex-direction:column;gap:1rem}.space-x-3{display:flex;gap:1rem}.space-y-4{display:flex;flex-direction:column;gap:1.5rem}.space-x-4{display:flex;gap:1.5rem}.space-y-5{display:flex;flex-direction:column;gap:2rem}.space-x-5{display:flex;gap:2rem}.space-y-6{display:flex;flex-direction:column;gap:2.5rem}.space-x-6{display:flex;gap:2.5rem}.divide-y>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y>:not(template):not(:first-child){padding-top:1rem!important}.divide-y>:not(template):not(:last-child){padding-bottom:1rem!important}.divide-x>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x>:not(template):not(:first-child){padding-left:1rem!important}.divide-x>:not(template):not(:last-child){padding-right:1rem!important}.divide-y-0>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y-0>:not(template):not(:first-child){padding-top:0!important}.divide-y-0>:not(template):not(:last-child){padding-bottom:0!important}.divide-x-0>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x-0>:not(template):not(:first-child){padding-left:0!important}.divide-x-0>:not(template):not(:last-child){padding-right:0!important}.divide-y-1>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y-1>:not(template):not(:first-child){padding-top:.25rem!important}.divide-y-1>:not(template):not(:last-child){padding-bottom:.25rem!important}.divide-x-1>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x-1>:not(template):not(:first-child){padding-left:.25rem!important}.divide-x-1>:not(template):not(:last-child){padding-right:.25rem!important}.divide-y-2>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y-2>:not(template):not(:first-child){padding-top:.5rem!important}.divide-y-2>:not(template):not(:last-child){padding-bottom:.5rem!important}.divide-x-2>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x-2>:not(template):not(:first-child){padding-left:.5rem!important}.divide-x-2>:not(template):not(:last-child){padding-right:.5rem!important}.divide-y-3>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y-3>:not(template):not(:first-child){padding-top:1rem!important}.divide-y-3>:not(template):not(:last-child){padding-bottom:1rem!important}.divide-x-3>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x-3>:not(template):not(:first-child){padding-left:1rem!important}.divide-x-3>:not(template):not(:last-child){padding-right:1rem!important}.divide-y-4>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y-4>:not(template):not(:first-child){padding-top:1.5rem!important}.divide-y-4>:not(template):not(:last-child){padding-bottom:1.5rem!important}.divide-x-4>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x-4>:not(template):not(:first-child){padding-left:1.5rem!important}.divide-x-4>:not(template):not(:last-child){padding-right:1.5rem!important}.divide-y-5>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y-5>:not(template):not(:first-child){padding-top:2rem!important}.divide-y-5>:not(template):not(:last-child){padding-bottom:2rem!important}.divide-x-5>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x-5>:not(template):not(:first-child){padding-left:2rem!important}.divide-x-5>:not(template):not(:last-child){padding-right:2rem!important}.divide-y-6>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y-6>:not(template):not(:first-child){padding-top:2.5rem!important}.divide-y-6>:not(template):not(:last-child){padding-bottom:2.5rem!important}.divide-x-6>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x-6>:not(template):not(:first-child){padding-left:2.5rem!important}.divide-x-6>:not(template):not(:last-child){padding-right:2.5rem!important}.divide-y-fill{display:flex;flex-direction:column;height:100%}.divide-y-fill>:not(template){flex:1;display:flex;justify-content:center;flex-direction:column}.icon{--tblr-icon-size: 1.25rem;width:var(--tblr-icon-size);height:var(--tblr-icon-size);font-size:var(--tblr-icon-size);vertical-align:bottom;stroke-width:1.5}.icon:hover{text-decoration:none}.icon-inline{--tblr-icon-size: 1rem;vertical-align:-.2rem}.icon-filled{fill:currentColor}.icon-sm{--tblr-icon-size: 1rem;stroke-width:1}.icon-md{--tblr-icon-size: 2.5rem;stroke-width:1}.icon-lg{--tblr-icon-size: 3.5rem;stroke-width:1}.icon-pulse{transition:all .15s ease 0s;animation:pulse 2s ease infinite;animation-fill-mode:both}.icon-tada{transition:all .15s ease 0s;animation:tada 3s ease infinite;animation-fill-mode:both}.icon-rotate{transition:all .15s ease 0s;animation:rotate-360 3s linear infinite;animation-fill-mode:both}.img-responsive{--tblr-img-responsive-ratio: 75%;background:no-repeat center/cover;padding-top:var(--tblr-img-responsive-ratio)}.img-responsive-grid{padding-top:calc(var(--tblr-img-responsive-ratio) - var(--tblr-gutter-y) / 2)}.img-responsive-1x1{--tblr-img-responsive-ratio: 100%}.img-responsive-2x1{--tblr-img-responsive-ratio: 50%}.img-responsive-1x2{--tblr-img-responsive-ratio: 200%}.img-responsive-3x1{--tblr-img-responsive-ratio: 33.3333333333%}.img-responsive-1x3{--tblr-img-responsive-ratio: 300%}.img-responsive-4x1{--tblr-img-responsive-ratio: 25%}.img-responsive-1x4{--tblr-img-responsive-ratio: 400%}.img-responsive-4x3{--tblr-img-responsive-ratio: 75%}.img-responsive-3x4{--tblr-img-responsive-ratio: 133.3333333333%}.img-responsive-16x9{--tblr-img-responsive-ratio: 56.25%}.img-responsive-9x16{--tblr-img-responsive-ratio: 177.7777777778%}.img-responsive-21x9{--tblr-img-responsive-ratio: 42.8571428571%}.img-responsive-9x21{--tblr-img-responsive-ratio: 233.3333333333%}.img-bg{background:no-repeat center/cover}textarea[cols]{height:auto}.col-form-label,.form-label{display:block;font-weight:var(--tblr-font-weight-medium)}.col-form-label.required:after,.form-label.required:after{content:"*";margin-left:.25rem;color:#d63939}.form-label-description{float:right;font-weight:var(--tblr-font-weight-normal);color:var(--tblr-secondary)}.form-hint{display:block;color:var(--tblr-secondary)}.form-hint:last-child{margin-bottom:0}.form-hint+.form-control{margin-top:.25rem}.form-label+.form-hint{margin-top:-.25rem}.input-group+.form-hint,.form-control+.form-hint,.form-select+.form-hint{margin-top:.5rem;color:var(--tblr-secondary)}.form-select:-moz-focusring{color:var(--tblr-body-color)}.form-control:-webkit-autofill{box-shadow:0 0 0 1000px var(--tblr-bg-surface-secondary) inset;color:var(--tblr-body-color);-webkit-text-fill-color:var(--tblr-body-color)}.form-control:disabled,.form-control.disabled{color:var(--tblr-secondary);user-select:none}.form-control[size]{width:auto}.form-control-light{background-color:var(--tblr-gray-100);border-color:transparent}.form-control-dark{background-color:#0000001a;color:#fff;border-color:transparent}.form-control-dark:focus{background-color:#0000001a;box-shadow:none;border-color:#ffffff3d}.form-control-dark::placeholder{color:#fff9}.form-control-rounded{border-radius:10rem}.form-control-flush{padding:0;background:none!important;border-color:transparent!important;resize:none;box-shadow:none!important;line-height:inherit}.form-footer{margin-top:2rem}.form-fieldset{padding:1rem;margin-bottom:1rem;background:var(--tblr-bg-surface-secondary);border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);border-radius:var(--tblr-border-radius)}fieldset:empty{display:none}.form-help{display:inline-flex;font-weight:var(--tblr-font-weight-bold);align-items:center;justify-content:center;width:1.125rem;height:1.125rem;font-size:.75rem;color:var(--tblr-secondary);text-align:center;text-decoration:none;cursor:pointer;user-select:none;background:var(--tblr-gray-100);border-radius:100rem;transition:background-color .3s,color .3s}@media(prefers-reduced-motion:reduce){.form-help{transition:none}}.form-help:hover,.form-help[aria-describedby]{color:#fff;background:var(--tblr-primary)}.input-group{box-shadow:var(--tblr-shadow-input);border-radius:var(--tblr-border-radius)}.input-group .form-control,.input-group .btn{box-shadow:none}.input-group-link{font-size:.75rem}.input-group-flat:focus-within{box-shadow:0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25);border-radius:var(--tblr-border-radius)}.input-group-flat:focus-within .form-control,.input-group-flat:focus-within .input-group-text{border-color:#80c2be!important}.input-group-flat .form-control:focus{border-color:var(--tblr-border-color);box-shadow:none}.input-group-flat .form-control:not(:last-child){border-right:0}.input-group-flat .form-control:not(:first-child){border-left:0}.input-group-flat .input-group-text{background:var(--tblr-bg-forms);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.input-group-flat .input-group-text{transition:none}}.input-group-flat .input-group-text:first-child{padding-right:0}.input-group-flat .input-group-text:last-child{padding-left:0}.form-file-button{margin-left:0;border-left:0}label[for=floating-input]{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media(max-width:575.98px){.form-control,.form-select{font-size:1rem}}.input-icon{position:relative}.input-icon .form-control:not(:last-child),.input-icon .form-select:not(:last-child){padding-right:2.5rem}.input-icon .form-control:not(:first-child),.input-icon .form-select:not(:last-child){padding-left:2.5rem}.input-icon-addon{position:absolute;top:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;min-width:2.5rem;color:var(--tblr-icon-color);pointer-events:none;font-size:1.2em}.input-icon-addon:last-child{right:0;left:auto}.form-colorinput{position:relative;display:inline-block;margin:0;line-height:1;cursor:pointer}.form-colorinput-input{position:absolute;z-index:-1;opacity:0}.form-colorinput-color{display:block;width:1.5rem;height:1.5rem;color:#fff;border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent);border-radius:var(--tblr-border-radius);box-shadow:0 1px 2px #0000000d}.form-colorinput-color:before{position:absolute;top:0;left:0;width:100%;height:100%;content:"";background:no-repeat center center/1.25rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' width='16' height='16'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8.5l2.5 2.5l5.5 -5.5'/%3e%3c/svg%3e");opacity:0;transition:opacity .3s}@media(prefers-reduced-motion:reduce){.form-colorinput-color:before{transition:none}}.form-colorinput-input:checked~.form-colorinput-color:before{opacity:1}.form-colorinput-input:focus~.form-colorinput-color{border-color:var(--tblr-primary);box-shadow:0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.form-colorinput-light .form-colorinput-color:before{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' width='16' height='16'%3e%3cpath fill='none' stroke='%231f2937' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8.5l2.5 2.5l5.5 -5.5'/%3e%3c/svg%3e")}.form-imagecheck{--tblr-form-imagecheck-radius: var(--tblr-border-radius);position:relative;margin:0;cursor:pointer}.form-imagecheck-input{position:absolute;z-index:-1;opacity:0}.form-imagecheck-figure{position:relative;display:block;margin:0;user-select:none;border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);border-radius:var(--tblr-form-imagecheck-radius)}.form-imagecheck-input:focus~.form-imagecheck-figure{border-color:var(--tblr-primary);box-shadow:0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.form-imagecheck-input:checked~.form-imagecheck-figure{border-color:var(--tblr-primary)}.form-imagecheck-figure:before{position:absolute;top:.25rem;left:.25rem;z-index:1;display:block;width:1.25rem;height:1.25rem;color:#fff;pointer-events:none;content:"";user-select:none;background:var(--tblr-bg-forms);border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);border-radius:var(--tblr-border-radius);transition:opacity .3s}@media(prefers-reduced-motion:reduce){.form-imagecheck-figure:before{transition:none}}.form-imagecheck-input:checked~.form-imagecheck-figure:before{background-color:var(--tblr-primary);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' width='16' height='16'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8.5l2.5 2.5l5.5 -5.5'/%3e%3c/svg%3e");background-repeat:repeat;background-position:center;background-size:1.25rem;border-color:var(--tblr-border-color-translucent)}.form-imagecheck-input[type=radio]~.form-imagecheck-figure:before{border-radius:50%}.form-imagecheck-input[type=radio]:checked~.form-imagecheck-figure:before{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3ccircle r='3' fill='%23ffffff' cx='8' cy='8' /%3e%3c/svg%3e")}.form-imagecheck-image{max-width:100%;display:block;opacity:.64;transition:opacity .3s}@media(prefers-reduced-motion:reduce){.form-imagecheck-image{transition:none}}.form-imagecheck-image:first-child{border-top-left-radius:calc(var(--tblr-form-imagecheck-radius) - 1px);border-top-right-radius:calc(var(--tblr-form-imagecheck-radius) - 1px)}.form-imagecheck-image:last-child{border-bottom-right-radius:calc(var(--tblr-form-imagecheck-radius) - 1px);border-bottom-left-radius:calc(var(--tblr-form-imagecheck-radius) - 1px)}.form-imagecheck:hover .form-imagecheck-image,.form-imagecheck-input:focus~.form-imagecheck-figure .form-imagecheck-image,.form-imagecheck-input:checked~.form-imagecheck-figure .form-imagecheck-image{opacity:1}.form-imagecheck-caption{padding:.25rem;font-size:.765625rem;color:var(--tblr-secondary);text-align:center;transition:color .3s}@media(prefers-reduced-motion:reduce){.form-imagecheck-caption{transition:none}}.form-imagecheck:hover .form-imagecheck-caption,.form-imagecheck-input:focus~.form-imagecheck-figure .form-imagecheck-caption,.form-imagecheck-input:checked~.form-imagecheck-figure .form-imagecheck-caption{color:var(--tblr-body-color)}.form-selectgroup{display:inline-flex;margin:0 -.5rem -.5rem 0;flex-wrap:wrap}.form-selectgroup .form-selectgroup-item{margin:0 .5rem .5rem 0}.form-selectgroup-vertical{flex-direction:column}.form-selectgroup-item{display:block;position:relative}.form-selectgroup-input{position:absolute;top:0;left:0;z-index:-1;opacity:0}.form-selectgroup-label{position:relative;display:block;min-width:calc(1.25rem + 1.125rem + calc(var(--tblr-border-width) * 2));margin:0;padding:.5625rem 1rem;font-size:.875rem;line-height:1.25rem;color:var(--tblr-secondary);background:var(--tblr-bg-forms);text-align:center;cursor:pointer;user-select:none;border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);border-radius:var(--tblr-border-radius);box-shadow:var(--tblr-shadow-input);transition:border-color .3s,background .3s,color .3s}@media(prefers-reduced-motion:reduce){.form-selectgroup-label{transition:none}}.form-selectgroup-label .icon:only-child{margin:0 -.25rem}.form-selectgroup-label:hover{color:var(--tblr-body-color)}.form-selectgroup-check{display:inline-block;width:1.25rem;height:1.25rem;border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent);vertical-align:middle;box-shadow:var(--tblr-shadow-input)}.form-selectgroup-input[type=checkbox]+.form-selectgroup-label .form-selectgroup-check{border-radius:var(--tblr-border-radius)}.form-selectgroup-input[type=radio]+.form-selectgroup-label .form-selectgroup-check{border-radius:50%}.form-selectgroup-input:checked+.form-selectgroup-label .form-selectgroup-check{background-color:var(--tblr-primary);background-repeat:repeat;background-position:center;background-size:1.25rem;border-color:var(--tblr-border-color-translucent)}.form-selectgroup-input[type=checkbox]:checked+.form-selectgroup-label .form-selectgroup-check{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' width='16' height='16'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8.5l2.5 2.5l5.5 -5.5'/%3e%3c/svg%3e")}.form-selectgroup-input[type=radio]:checked+.form-selectgroup-label .form-selectgroup-check{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3ccircle r='3' fill='%23ffffff' cx='8' cy='8' /%3e%3c/svg%3e")}.form-selectgroup-check-floated{position:absolute;top:.5625rem;right:.5625rem}.form-selectgroup-input:checked+.form-selectgroup-label{z-index:1;color:var(--tblr-primary);background:rgba(var(--tblr-primary-rgb),.04);border-color:var(--tblr-primary)}.form-selectgroup-input:focus+.form-selectgroup-label{z-index:2;color:var(--tblr-primary);border-color:var(--tblr-primary);box-shadow:0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.form-selectgroup-boxes .form-selectgroup-label{text-align:left;padding:1.25rem 1rem;color:inherit}.form-selectgroup-boxes .form-selectgroup-input:checked+.form-selectgroup-label{color:inherit}.form-selectgroup-boxes .form-selectgroup-input:checked+.form-selectgroup-label .form-selectgroup-title{color:var(--tblr-primary)}.form-selectgroup-boxes .form-selectgroup-input:checked+.form-selectgroup-label .form-selectgroup-label-content{opacity:1}.form-selectgroup-pills{flex-wrap:wrap;align-items:flex-start}.form-selectgroup-pills .form-selectgroup-item{flex-grow:0}.form-selectgroup-pills .form-selectgroup-label{border-radius:50px}.form-control-color::-webkit-color-swatch{border:none}[type=search]::-webkit-search-cancel-button{-webkit-appearance:none}.form-control::file-selector-button{background-color:var(--tblr-btn-color, var(--tblr-tertiary-bg))}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:var(--tblr-btn-color, var(--tblr-secondary-bg))}.form-check{user-select:none}.form-check.form-check-highlight .form-check-input:not(:checked)~.form-check-label{color:var(--tblr-secondary)}.form-check .form-check-label-off{color:var(--tblr-secondary)}.form-check .form-check-input:checked~.form-check-label-off{display:none}.form-check .form-check-input:not(:checked)~.form-check-label-on{display:none}.form-check-input{background-size:1.25rem;margin-top:0rem;box-shadow:var(--tblr-shadow-input)}.form-switch .form-check-input{transition:background-color .3s,background-position .3s}@media(prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-check-label{display:block}.form-check-label.required:after{content:"*";margin-left:.25rem;color:#d63939}.form-check-description{display:block;color:var(--tblr-secondary);font-size:.75rem;margin-top:.25rem}.form-check-single,.form-check-single .form-check-input{margin:0}.form-switch .form-check-input{height:1.25rem;margin-top:0rem}.form-switch-lg{padding-left:3.5rem;min-height:1.5rem}.form-switch-lg .form-check-input{height:1.5rem;width:2.75rem;background-size:1.5rem;margin-left:-3.5rem}.form-switch-lg .form-check-label{padding-top:.125rem}.form-check-input:checked{border:none}.form-select.is-invalid-lite,.form-control.is-invalid-lite,.form-select.is-valid-lite,.form-control.is-valid-lite{border-color:var(--tblr-border-color)!important}.legend{--tblr-legend-size: .75em;display:inline-block;background:var(--tblr-border-color);width:var(--tblr-legend-size);height:var(--tblr-legend-size);border-radius:var(--tblr-border-radius-sm);border:1px solid var(--tblr-border-color-translucent)}.list-group{margin-left:0;margin-right:0}.list-group-header{background:var(--tblr-bg-surface-tertiary);padding:.5rem 1.25rem;font-size:.75rem;font-weight:var(--tblr-font-weight-medium);line-height:1;text-transform:uppercase;color:var(--tblr-gray-500);border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.list-group-flush>.list-group-header:last-child{border-bottom-width:0}.list-group-item{background-color:inherit}.list-group-item.active{background-color:rgba(var(--tblr-secondary-rgb),.08);border-left-color:#00857d;border-left-width:2px}.list-group-item.disabled,.list-group-item:disabled{color:#6b7280;background-color:rgba(var(--tblr-secondary-rgb),.08)}.list-bordered .list-item{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);margin-top:-1px}.list-bordered .list-item:first-child{border-top:none}.list-group-hoverable .list-group-item:active,.list-group-hoverable .list-group-item:focus,.list-group-hoverable .list-group-item:hover{background-color:rgba(var(--tblr-secondary-rgb),.08)}.list-group-hoverable .list-group-item-actions{opacity:0;transition:opacity .3s}@media(prefers-reduced-motion:reduce){.list-group-hoverable .list-group-item-actions{transition:none}}.list-group-hoverable .list-group-item:hover .list-group-item-actions,.list-group-hoverable .list-group-item-actions.show{opacity:1}.list-group-transparent{--tblr-list-group-border-radius: 0;margin:0 -1.25rem}.list-group-transparent .list-group-item{background:none;border:0}.list-group-transparent .list-group-item .icon{color:var(--tblr-secondary)}.list-group-transparent .list-group-item.active{font-weight:var(--tblr-font-weight-bold);color:inherit;background:var(--tblr-active-bg)}.list-group-transparent .list-group-item.active .icon{color:inherit}.list-separated{display:flex;flex-direction:column;gap:1rem}.list-inline{margin:0}.list-inline-item:not(:last-child){margin-right:auto;margin-inline-end:.5rem}.list-inline-dots .list-inline-item+.list-inline-item:before{content:" \b7 ";margin-inline-end:.5rem}.loader{position:relative;display:block;width:2.5rem;height:2.5rem;color:#066fd1;vertical-align:middle}.loader:after{position:absolute;top:0;left:0;width:100%;height:100%;content:"";border:1px var(--tblr-border-style);border-color:transparent;border-top-color:currentColor;border-left-color:currentColor;border-radius:100rem;animation:rotate-360 .6s linear;animation-iteration-count:infinite}.dimmer{position:relative}.dimmer .loader{position:absolute;top:50%;right:0;left:0;display:none;margin:0 auto;transform:translateY(-50%)}.dimmer.active .loader{display:block}.dimmer.active .dimmer-content{pointer-events:none;opacity:.1}@keyframes animated-dots{0%{transform:translate(-100%)}}.animated-dots{display:inline-block;overflow:hidden;vertical-align:bottom}.animated-dots:after{display:inline-block;content:"...";animation:animated-dots 1.2s steps(4,jump-none) infinite}.modal-content>.btn-close,.modal-header>.btn-close{position:absolute;top:0;right:0;width:3.5rem;height:3.5rem;margin:0;padding:0;z-index:10}.modal-body{scrollbar-color:color-mix(in srgb,var(--tblr-scrollbar-color, var(--tblr-body-color)) 20%,transparent) transparent}.modal-body::-webkit-scrollbar{width:1rem;height:1rem;transition:background .3s}@media(prefers-reduced-motion:reduce){.modal-body::-webkit-scrollbar{transition:none}}.modal-body::-webkit-scrollbar-thumb{border-radius:1rem;border:5px solid transparent;box-shadow:inset 0 0 0 1rem color-mix(in srgb,var(--tblr-scrollbar-color, var(--tblr-body-color)) 20%,transparent)}.modal-body::-webkit-scrollbar-track{background:transparent}.modal-body:hover::-webkit-scrollbar-thumb{box-shadow:inset 0 0 0 1rem color-mix(in srgb,var(--tblr-scrollbar-color, var(--tblr-body-color)) 40%,transparent)}.modal-body::-webkit-scrollbar-corner{background:transparent}.modal-body .modal-title{margin-bottom:1rem}.modal-body+.modal-body{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.modal-status{position:absolute;top:0;left:0;right:0;height:2px;background:var(--tblr-secondary);border-radius:var(--tblr-border-radius-lg) var(--tblr-border-radius-lg) 0 0}.modal-header{align-items:center;min-height:3.5rem;background:transparent;padding:0 3.5rem 0 1.5rem}.modal-title{font-size:1rem;font-weight:var(--tblr-font-weight-bold);color:inherit;line-height:1.4285714286}.modal-footer{padding-top:.75rem;padding-bottom:.75rem}.modal-blur{backdrop-filter:blur(4px)}.modal-full-width{max-width:none;margin:0 .5rem}.nav{--tblr-nav-link-hover-bg: color-mix(in srgb, var(--tblr-nav-link-color) 4%, transparent)}.nav-vertical,.nav-vertical .nav{flex-direction:column;flex-wrap:nowrap}.nav-vertical .nav{margin-left:1.25rem;border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);padding-left:.5rem}.nav-vertical .nav-link.active,.nav-vertical .nav-item.show .nav-link{font-weight:var(--tblr-font-weight-bold);color:var(--tblr-nav-link-active-color)}.nav-vertical.nav-pills{margin:0 -.75rem}.nav-bordered{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.nav-bordered .nav-item+.nav-item{margin-left:1.25rem}.nav-bordered .nav-link{padding-left:0;padding-right:0;margin:0 0 calc(-1 * var(--tblr-border-width));border:0;border-bottom:2px var(--tblr-border-style) transparent}.nav-bordered .nav-link:hover{background-color:transparent}.nav-bordered .nav-link.active,.nav-bordered .nav-item.show .nav-link{color:var(--tblr-primary);border-color:var(--tblr-primary)}.nav-underline .nav-link{border-radius:0}.nav-link{display:flex;transition:color .3s,background-color .3s}@media(prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link{align-items:center}.nav-link:hover,.nav-link:focus{background-color:var(--tblr-nav-link-hover-bg)}.nav-link-toggle{margin-left:auto;padding:0 .25rem;transition:transform .3s}@media(prefers-reduced-motion:reduce){.nav-link-toggle{transition:none}}.nav-link-toggle:after{content:"";display:inline-block;vertical-align:.306em;width:.36em;height:.36em;border-bottom:1px var(--tblr-border-style);border-left:1px var(--tblr-border-style);margin-right:.1em;margin-left:.4em;transform:rotate(-45deg)}.nav-link-toggle:after{margin:0}.nav-link[aria-expanded=true] .nav-link-toggle{transform:rotate(180deg)}.nav-link-icon{width:1.25rem;height:1.25rem;margin-right:.5rem;color:inherit}.nav-link-icon svg{display:block;height:100%}.nav-fill .nav-item .nav-link{justify-content:center}.stars{display:inline-flex;color:#9ca3af;font-size:.75rem}.stars .star:not(:first-child){margin-left:.25rem}.pagination{margin:0;--tblr-pagination-gap: .25rem;user-select:none;gap:var(--tblr-pagination-gap);line-height:var(--tblr-body-line-height)}.page-link{min-width:2rem;border-radius:var(--tblr-pagination-border-radius)}.page-item:not(.active) .page-link:hover{background:var(--tblr-pagination-hover-bg)}.page-text{padding-left:.5rem;padding-right:.5rem}.page-item{text-align:center}.page-item.page-prev,.page-item.page-next{flex:0 0 50%;text-align:left}.page-item.page-next{margin-left:auto;text-align:right}.page-item-subtitle{margin-bottom:2px;font-size:12px;color:var(--tblr-secondary);text-transform:uppercase}.page-item.disabled .page-item-subtitle{color:var(--tblr-disabled-color)}.page-item-title{font-size:1rem;font-weight:var(--tblr-font-weight-normal);color:var(--tblr-body-color)}.page-link:hover .page-item-title{color:#00857d}.page-item.disabled .page-item-title{color:var(--tblr-disabled-color)}.pagination-outline{--tblr-pagination-border-color: var(--tblr-border-color);--tblr-pagination-disabled-border-color: var(--tblr-border-color);--tblr-pagination-border-width: 1px}.pagination-circle{--tblr-pagination-border-radius: var(--tblr-border-radius-pill)}@keyframes progress-indeterminate{0%{right:100%;left:-35%}to,60%{right:-90%;left:100%}}.progress{position:relative;width:100%;line-height:.5rem;appearance:none}.progress::-webkit-progress-bar{background:var(--tblr-progress-bg)}.progress::-webkit-progress-value{background-color:var(--tblr-primary)}.progress::-moz-progress-bar{background-color:var(--tblr-primary)}.progress::-ms-fill{background-color:var(--tblr-primary);border:none}.progress-sm{height:.25rem}.progress-bar{height:100%}.progress-bar-indeterminate:after,.progress-bar-indeterminate:before{position:absolute;top:0;bottom:0;left:0;content:"";background-color:inherit;will-change:left,right}.progress-bar-indeterminate:before{animation:progress-indeterminate 1.5s cubic-bezier(.65,.815,.735,.395) infinite}.progress-separated .progress-bar{box-shadow:0 0 0 2px var(--tblr-card-bg, var(--tblr-bg-surface))}.progressbg{position:relative;padding:.25rem .5rem;display:flex}.progressbg-text{position:relative;z-index:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.progressbg-progress{position:absolute;inset:0;z-index:0;height:100%;background:transparent;pointer-events:none}.progressbg-value{font-weight:var(--tblr-font-weight-medium);margin-left:auto;padding-left:2rem}.ribbon{--tblr-ribbon-margin: .25rem;--tblr-ribbon-border-radius: var(--tblr-border-radius);position:absolute;top:.75rem;right:calc(-1 * var(--tblr-ribbon-margin));z-index:1;padding:.25rem .75rem;font-size:.625rem;font-weight:var(--tblr-font-weight-bold);line-height:1;color:#fff;text-align:center;text-transform:uppercase;background:var(--tblr-primary);border-color:var(--tblr-primary);border-radius:var(--tblr-ribbon-border-radius) 0 var(--tblr-ribbon-border-radius) var(--tblr-ribbon-border-radius);display:inline-flex;align-items:center;justify-content:center;min-height:2rem;min-width:2rem}.ribbon:before{position:absolute;right:0;bottom:100%;width:0;height:0;content:"";filter:brightness(70%);border:calc(var(--tblr-ribbon-margin) * .5) var(--tblr-border-style);border-color:inherit;border-top-color:transparent;border-right-color:transparent}.ribbon.bg-blue{border-color:var(--tblr-blue)}.ribbon.bg-blue-lt{border-color:rgba(var(--tblr-blue-rgb),.1)!important}.ribbon.bg-azure{border-color:var(--tblr-azure)}.ribbon.bg-azure-lt{border-color:rgba(var(--tblr-azure-rgb),.1)!important}.ribbon.bg-indigo{border-color:var(--tblr-indigo)}.ribbon.bg-indigo-lt{border-color:rgba(var(--tblr-indigo-rgb),.1)!important}.ribbon.bg-purple{border-color:var(--tblr-purple)}.ribbon.bg-purple-lt{border-color:rgba(var(--tblr-purple-rgb),.1)!important}.ribbon.bg-pink{border-color:var(--tblr-pink)}.ribbon.bg-pink-lt{border-color:rgba(var(--tblr-pink-rgb),.1)!important}.ribbon.bg-red{border-color:var(--tblr-red)}.ribbon.bg-red-lt{border-color:rgba(var(--tblr-red-rgb),.1)!important}.ribbon.bg-orange{border-color:var(--tblr-orange)}.ribbon.bg-orange-lt{border-color:rgba(var(--tblr-orange-rgb),.1)!important}.ribbon.bg-yellow{border-color:var(--tblr-yellow)}.ribbon.bg-yellow-lt{border-color:rgba(var(--tblr-yellow-rgb),.1)!important}.ribbon.bg-lime{border-color:var(--tblr-lime)}.ribbon.bg-lime-lt{border-color:rgba(var(--tblr-lime-rgb),.1)!important}.ribbon.bg-green{border-color:var(--tblr-green)}.ribbon.bg-green-lt{border-color:rgba(var(--tblr-green-rgb),.1)!important}.ribbon.bg-teal{border-color:var(--tblr-teal)}.ribbon.bg-teal-lt{border-color:rgba(var(--tblr-teal-rgb),.1)!important}.ribbon.bg-cyan{border-color:var(--tblr-cyan)}.ribbon.bg-cyan-lt{border-color:rgba(var(--tblr-cyan-rgb),.1)!important}.ribbon .icon{width:1.25rem;height:1.25rem;font-size:1.25rem}.ribbon-top{top:calc(-1 * var(--tblr-ribbon-margin));right:.75rem;width:2rem;padding:.5rem 0;border-radius:0 var(--tblr-ribbon-border-radius) var(--tblr-ribbon-border-radius) var(--tblr-ribbon-border-radius)}.ribbon-top:before{top:0;right:100%;bottom:auto;border-color:inherit;border-top-color:transparent;border-left-color:transparent}.ribbon-top.ribbon-start{right:auto;left:.75rem}.ribbon-top.ribbon-start:before{top:0;right:100%;left:auto}.ribbon-start{right:auto;left:calc(-1 * var(--tblr-ribbon-margin));border-radius:0 var(--tblr-ribbon-border-radius) var(--tblr-ribbon-border-radius) var(--tblr-ribbon-border-radius)}.ribbon-start:before{top:auto;bottom:100%;left:0;border-color:inherit;border-top-color:transparent;border-left-color:transparent}.ribbon-bottom{top:auto;bottom:.75rem}.ribbon-bookmark{padding-left:.25rem;border-radius:0 0 var(--tblr-ribbon-border-radius) 0}.ribbon-bookmark:after{position:absolute;top:0;right:100%;display:block;width:0;height:0;content:"";border:1rem var(--tblr-border-style);border-color:inherit;border-right-width:0;border-left-color:transparent;border-left-width:.5rem}.ribbon-bookmark.ribbon-left{padding-right:.5rem}.ribbon-bookmark.ribbon-left:after{right:auto;left:100%;border-right-color:transparent;border-right-width:.5rem;border-left-width:0}.ribbon-bookmark.ribbon-top{padding-right:0;padding-bottom:.25rem;padding-left:0;border-radius:0 var(--tblr-ribbon-border-radius) 0 0}.ribbon-bookmark.ribbon-top:after{top:100%;right:0;left:0;border-color:inherit;border-width:1rem;border-top-width:0;border-bottom-color:transparent;border-bottom-width:.5rem}.markdown{line-height:2}.markdown>:first-child{margin-top:0}.markdown>:last-child,.markdown>:last-child .highlight{margin-bottom:0}@media(min-width:768px){.markdown>hr,.markdown>.hr{margin-top:3em;margin-bottom:3em}}.markdown>h1,.markdown>.h1,.markdown>h2,.markdown>.h2,.markdown>h3,.markdown>.h3,.markdown>h4,.markdown>.h4,.markdown>h5,.markdown>.h5,.markdown>h6,.markdown>.h6{font-weight:var(--tblr-font-weight-bold)}.markdown>h2,.markdown>.h2,.markdown>h3,.markdown>.h3,.markdown>h4,.markdown>.h4,.markdown>h5,.markdown>.h5,.markdown>h6,.markdown>.h6{margin-top:2.5rem}.markdown>table{font-size:var(--tblr-body-font-size)}.markdown>blockquote{font-size:1rem;margin:1.5rem 0;padding:.5rem 1.5rem}.markdown>img,.markdown>p>img{border-radius:var(--tblr-border-radius);border:1px solid var(--tblr-border-color)}.markdown pre{max-height:20rem}.placeholder:not(.btn):not([class*=bg-]){background-color:currentColor!important}.placeholder:not(.avatar):not([class*=card-img-]){border-radius:var(--tblr-border-radius)}.nav-segmented{--tblr-nav-bg: var(--tblr-bg-surface-tertiary);--tblr-nav-padding: 2px;--tblr-nav-height: 2.5rem;--tblr-nav-gap: .25rem;--tblr-nav-active-bg: var(--tblr-bg-surface);--tblr-nav-font-size: inherit;--tblr-nav-radius: 6px;--tblr-nav-link-disabled-color: var(--tblr-disabled-color);--tblr-nav-link-gap: .25rem;--tblr-nav-link-padding-x: .75rem;--tblr-nav-link-icon-size: 1.25rem;display:inline-flex;flex-wrap:wrap;gap:var(--tblr-nav-gap);padding:var(--tblr-nav-padding);list-style:none;background:var(--tblr-nav-bg);border-radius:calc(var(--tblr-nav-radius) + var(--tblr-nav-padding));box-shadow:inset 0 0 0 1px #0000000a}.nav-segmented .nav-link{display:inline-flex;gap:calc(.25rem + var(--tblr-nav-link-gap));align-items:center;margin:0;font-size:var(--tblr-nav-font-size);min-width:calc(var(--tblr-nav-height) - 2 * var(--tblr-nav-padding));height:calc(var(--tblr-nav-height) - 2 * var(--tblr-nav-padding));padding:0 calc(var(--tblr-nav-link-padding-x) - 2px);border:1px solid transparent;background:transparent;color:var(--tblr-secondary);text-align:center;text-decoration:none;white-space:nowrap;cursor:pointer;transition:background-color .3s,color .3s;border-radius:var(--tblr-nav-radius);flex-grow:1;justify-content:center}.nav-segmented .nav-link:hover,.nav-segmented .nav-link.hover{background:#0000000a;color:var(--tblr-body-color)}.nav-segmented .nav-link.disabled,.nav-segmented .nav-link:disabled{color:var(--tblr-nav-link-disabled-color);cursor:not-allowed}.nav-segmented .nav-link-input:checked+.nav-link,.nav-segmented .nav-link.active{color:var(--tblr-body-color);background:var(--tblr-nav-active-bg);border-color:var(--tblr-border-color)}.nav-segmented .nav-link-input{display:none}.nav-segmented .nav-link-icon{width:var(--tblr-nav-link-icon-size);height:var(--tblr-nav-link-icon-size);margin:0 -.25rem;color:inherit}.nav-segmented-vertical{flex-direction:column}.nav-segmented-vertical .nav-link{justify-content:flex-start}.nav-sm{--tblr-nav-height: 2rem;--tblr-nav-font-size: var(--tblr-font-size-h5);--tblr-nav-radius: 4px;--tblr-nav-link-padding-x: .5rem;--tblr-nav-link-gap: .25rem;--tblr-nav-link-icon-size: 1rem}.nav-lg{--tblr-nav-height: 3rem;--tblr-nav-font-size: var(--tblr-font-size-h3);--tblr-nav-radius: 8px;--tblr-nav-link-padding-x: 1rem;--tblr-nav-link-gap: .5rem;--tblr-nav-link-icon-size: 1.5rem}.steps{--tblr-steps-color: var(--tblr-primary);--tblr-steps-inactive-color: var(--tblr-border-color);--tblr-steps-dot-size: .5rem;--tblr-steps-border-width: 2px;display:flex;flex-wrap:nowrap;width:100%;padding:0;margin:0;list-style:none}.steps-blue{--tblr-steps-color: var(--tblr-blue)}.steps-blue-lt{--tblr-steps-color: var(--tblr-blue-lt)}.steps-azure{--tblr-steps-color: var(--tblr-azure)}.steps-azure-lt{--tblr-steps-color: var(--tblr-azure-lt)}.steps-indigo{--tblr-steps-color: var(--tblr-indigo)}.steps-indigo-lt{--tblr-steps-color: var(--tblr-indigo-lt)}.steps-purple{--tblr-steps-color: var(--tblr-purple)}.steps-purple-lt{--tblr-steps-color: var(--tblr-purple-lt)}.steps-pink{--tblr-steps-color: var(--tblr-pink)}.steps-pink-lt{--tblr-steps-color: var(--tblr-pink-lt)}.steps-red{--tblr-steps-color: var(--tblr-red)}.steps-red-lt{--tblr-steps-color: var(--tblr-red-lt)}.steps-orange{--tblr-steps-color: var(--tblr-orange)}.steps-orange-lt{--tblr-steps-color: var(--tblr-orange-lt)}.steps-yellow{--tblr-steps-color: var(--tblr-yellow)}.steps-yellow-lt{--tblr-steps-color: var(--tblr-yellow-lt)}.steps-lime{--tblr-steps-color: var(--tblr-lime)}.steps-lime-lt{--tblr-steps-color: var(--tblr-lime-lt)}.steps-green{--tblr-steps-color: var(--tblr-green)}.steps-green-lt{--tblr-steps-color: var(--tblr-green-lt)}.steps-teal{--tblr-steps-color: var(--tblr-teal)}.steps-teal-lt{--tblr-steps-color: var(--tblr-teal-lt)}.steps-cyan{--tblr-steps-color: var(--tblr-cyan)}.steps-cyan-lt{--tblr-steps-color: var(--tblr-cyan-lt)}.step-item{position:relative;flex:1 1 0;min-height:1rem;margin-top:0;color:inherit;text-align:center;cursor:default;padding-top:calc(var(--tblr-steps-dot-size))}a.step-item{cursor:pointer}a.step-item:hover{color:inherit}.step-item:after,.step-item:before{background:var(--tblr-steps-color)}.step-item:not(:last-child):after{position:absolute;left:50%;width:100%;content:"";transform:translateY(-50%)}.step-item:after{top:calc(var(--tblr-steps-dot-size) * .5);height:var(--tblr-steps-border-width)}.step-item:before{content:"";position:absolute;top:0;left:50%;z-index:1;box-sizing:content-box;display:flex;align-items:center;justify-content:center;border-radius:100rem;transform:translate(-50%);color:var(--tblr-white);width:var(--tblr-steps-dot-size);height:var(--tblr-steps-dot-size)}.step-item.active{font-weight:var(--tblr-font-weight-bold)}.step-item.active:after{background:var(--tblr-steps-inactive-color)}.step-item.active~.step-item{color:var(--tblr-disabled-color)}.step-item.active~.step-item:after,.step-item.active~.step-item:before{background:var(--tblr-steps-inactive-color)}.steps-counter{--tblr-steps-dot-size: 1.5rem;counter-reset:steps}.steps-counter .step-item{counter-increment:steps}.steps-counter .step-item:before{content:counter(steps)}.steps-vertical{--tblr-steps-dot-offset: 6px;flex-direction:column}.steps-vertical.steps-counter{--tblr-steps-dot-offset: -2px}.steps-vertical .step-item{text-align:left;padding-top:0;padding-left:calc(var(--tblr-steps-dot-size) + 1rem);min-height:auto}.steps-vertical .step-item:not(:first-child){margin-top:1rem}.steps-vertical .step-item:before{top:var(--tblr-steps-dot-offset);left:0;transform:translate(0)}.steps-vertical .step-item:not(:last-child):after{position:absolute;content:"";transform:translate(-50%);top:var(--tblr-steps-dot-offset);left:calc(var(--tblr-steps-dot-size) * .5);width:var(--tblr-steps-border-width);height:calc(100% + 1rem)}@keyframes status-pulsate-main{40%{transform:scale(1.25)}60%{transform:scale(1.25)}}@keyframes status-pulsate-secondary{10%{transform:scale(1)}30%{transform:scale(3)}80%{transform:scale(3)}to{transform:scale(1)}}@keyframes status-pulsate-tertiary{25%{transform:scale(1)}80%{transform:scale(3);opacity:0}to{transform:scale(3);opacity:0}}.status{--tblr-status-height: 1.5rem;--tblr-status-color: #6b7280;--tblr-status-color-rgb: 107, 114, 128;display:inline-flex;align-items:center;height:var(--tblr-status-height);padding:.25rem .75rem;gap:.5rem;color:var(--tblr-status-color);background:rgba(var(--tblr-status-color-rgb),.1);font-size:.875rem;text-transform:none;letter-spacing:normal;border-radius:100rem;font-weight:var(--tblr-font-weight-medium);line-height:1;margin:0}.status .status-dot{background:var(--tblr-status-color)}.status .icon{font-size:1.25rem}.status-lite{border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)!important;background:transparent!important;color:var(--tblr-body-color)!important}.status-primary{--tblr-status-color: #00857D;--tblr-status-color-rgb: 0, 133, 125}.status-secondary{--tblr-status-color: #6b7280;--tblr-status-color-rgb: 107, 114, 128}.status-success{--tblr-status-color: #2fb344;--tblr-status-color-rgb: 47, 179, 68}.status-info{--tblr-status-color: #4299e1;--tblr-status-color-rgb: 66, 153, 225}.status-warning{--tblr-status-color: #f59f00;--tblr-status-color-rgb: 245, 159, 0}.status-danger{--tblr-status-color: #d63939;--tblr-status-color-rgb: 214, 57, 57}.status-light{--tblr-status-color: #f9fafb;--tblr-status-color-rgb: 249, 250, 251}.status-dark{--tblr-status-color: #1f2937;--tblr-status-color-rgb: 31, 41, 55}.status-muted{--tblr-status-color: #6b7280;--tblr-status-color-rgb: 107, 114, 128}.status-blue{--tblr-status-color: #066fd1;--tblr-status-color-rgb: 6, 111, 209}.status-azure{--tblr-status-color: #4299e1;--tblr-status-color-rgb: 66, 153, 225}.status-indigo{--tblr-status-color: #4263eb;--tblr-status-color-rgb: 66, 99, 235}.status-purple{--tblr-status-color: #ae3ec9;--tblr-status-color-rgb: 174, 62, 201}.status-pink{--tblr-status-color: #d6336c;--tblr-status-color-rgb: 214, 51, 108}.status-red{--tblr-status-color: #d63939;--tblr-status-color-rgb: 214, 57, 57}.status-orange{--tblr-status-color: #f76707;--tblr-status-color-rgb: 247, 103, 7}.status-yellow{--tblr-status-color: #f59f00;--tblr-status-color-rgb: 245, 159, 0}.status-lime{--tblr-status-color: #74b816;--tblr-status-color-rgb: 116, 184, 22}.status-green{--tblr-status-color: #2fb344;--tblr-status-color-rgb: 47, 179, 68}.status-teal{--tblr-status-color: #0ca678;--tblr-status-color-rgb: 12, 166, 120}.status-cyan{--tblr-status-color: #17a2b8;--tblr-status-color-rgb: 23, 162, 184}.status-dot{--tblr-status-dot-color: var(--tblr-status-color, #6b7280);--tblr-status-size: .5rem;position:relative;display:inline-block;width:var(--tblr-status-size);height:var(--tblr-status-size);background:var(--tblr-status-dot-color);border-radius:100rem}.status-dot-animated:before{content:"";position:absolute;inset:0;z-index:0;background:inherit;border-radius:inherit;opacity:.6;animation:1s linear 2s backwards infinite status-pulsate-tertiary}.status-indicator{--tblr-status-indicator-size: 2.5rem;--tblr-status-indicator-color: var(--tblr-status-color, #6b7280);display:block;position:relative;width:var(--tblr-status-indicator-size);height:var(--tblr-status-indicator-size)}.status-indicator-circle{--tblr-status-circle-size: .75rem;position:absolute;left:50%;top:50%;margin:calc(var(--tblr-status-circle-size) / -2) 0 0 calc(var(--tblr-status-circle-size) / -2);width:var(--tblr-status-circle-size);height:var(--tblr-status-circle-size);border-radius:100rem;background:var(--tblr-status-color)}.status-indicator-circle:nth-child(1){z-index:3}.status-indicator-circle:nth-child(2){z-index:2;opacity:.1}.status-indicator-circle:nth-child(3){z-index:1;opacity:.3}.status-indicator-animated .status-indicator-circle:nth-child(1){animation:2s linear 1s infinite backwards status-pulsate-main}.status-indicator-animated .status-indicator-circle:nth-child(2){animation:2s linear 1s infinite backwards status-pulsate-secondary}.status-indicator-animated .status-indicator-circle:nth-child(3){animation:2s linear 1s infinite backwards status-pulsate-tertiary}.switch-icon{display:inline-block;line-height:1;border:0;padding:0;background:transparent;width:1.25rem;height:1.25rem;vertical-align:bottom;position:relative;cursor:pointer}.switch-icon.disabled{pointer-events:none;opacity:.4}.switch-icon:focus{outline:none}.switch-icon svg{display:block;width:100%;height:100%}.switch-icon .switch-icon-a,.switch-icon .switch-icon-b{display:block;width:100%;height:100%}.switch-icon .switch-icon-a{opacity:1}.switch-icon .switch-icon-b{position:absolute;top:0;left:0;opacity:0}.switch-icon.active .switch-icon-a{opacity:0}.switch-icon.active .switch-icon-b{opacity:1}.switch-icon-fade .switch-icon-a,.switch-icon-fade .switch-icon-b{transition:opacity .5s}@media(prefers-reduced-motion:reduce){.switch-icon-fade .switch-icon-a,.switch-icon-fade .switch-icon-b{transition:none}}.switch-icon-scale .switch-icon-a,.switch-icon-scale .switch-icon-b{transition:opacity .5s,transform 0s .5s}@media(prefers-reduced-motion:reduce){.switch-icon-scale .switch-icon-a,.switch-icon-scale .switch-icon-b{transition:none}}.switch-icon-scale .switch-icon-b{transform:scale(1.5)}.switch-icon-scale.active .switch-icon-a,.switch-icon-scale.active .switch-icon-b{transition:opacity 0s,transform .5s}@media(prefers-reduced-motion:reduce){.switch-icon-scale.active .switch-icon-a,.switch-icon-scale.active .switch-icon-b{transition:none}}.switch-icon-scale.active .switch-icon-b{transform:scale(1)}.switch-icon-flip{perspective:10em}.switch-icon-flip .switch-icon-a,.switch-icon-flip .switch-icon-b{backface-visibility:hidden;transform-style:preserve-3d;transition:opacity 0s .2s,transform .4s ease-in-out}@media(prefers-reduced-motion:reduce){.switch-icon-flip .switch-icon-a,.switch-icon-flip .switch-icon-b{transition:none}}.switch-icon-flip .switch-icon-a{opacity:1;transform:rotateY(0)}.switch-icon-flip .switch-icon-b{opacity:1;transform:rotateY(-180deg)}.switch-icon-flip.active .switch-icon-a{opacity:1;transform:rotateY(180deg)}.switch-icon-flip.active .switch-icon-b{opacity:1;transform:rotateY(0)}.switch-icon-slide-up,.switch-icon-slide-left,.switch-icon-slide-start,.switch-icon-slide-right,.switch-icon-slide-end,.switch-icon-slide-down{overflow:hidden}.switch-icon-slide-up .switch-icon-a,.switch-icon-slide-up .switch-icon-b,.switch-icon-slide-left .switch-icon-a,.switch-icon-slide-left .switch-icon-b,.switch-icon-slide-start .switch-icon-a,.switch-icon-slide-start .switch-icon-b,.switch-icon-slide-right .switch-icon-a,.switch-icon-slide-right .switch-icon-b,.switch-icon-slide-end .switch-icon-a,.switch-icon-slide-end .switch-icon-b,.switch-icon-slide-down .switch-icon-a,.switch-icon-slide-down .switch-icon-b{transition:opacity .3s,transform .3s}@media(prefers-reduced-motion:reduce){.switch-icon-slide-up .switch-icon-a,.switch-icon-slide-up .switch-icon-b,.switch-icon-slide-left .switch-icon-a,.switch-icon-slide-left .switch-icon-b,.switch-icon-slide-start .switch-icon-a,.switch-icon-slide-start .switch-icon-b,.switch-icon-slide-right .switch-icon-a,.switch-icon-slide-right .switch-icon-b,.switch-icon-slide-end .switch-icon-a,.switch-icon-slide-end .switch-icon-b,.switch-icon-slide-down .switch-icon-a,.switch-icon-slide-down .switch-icon-b{transition:none}}.switch-icon-slide-up .switch-icon-a,.switch-icon-slide-left .switch-icon-a,.switch-icon-slide-start .switch-icon-a,.switch-icon-slide-right .switch-icon-a,.switch-icon-slide-end .switch-icon-a,.switch-icon-slide-down .switch-icon-a{transform:translateY(0)}.switch-icon-slide-up .switch-icon-b,.switch-icon-slide-left .switch-icon-b,.switch-icon-slide-start .switch-icon-b,.switch-icon-slide-right .switch-icon-b,.switch-icon-slide-end .switch-icon-b,.switch-icon-slide-down .switch-icon-b{transform:translateY(100%)}.switch-icon-slide-up.active .switch-icon-a,.switch-icon-slide-left.active .switch-icon-a,.switch-icon-slide-start.active .switch-icon-a,.switch-icon-slide-right.active .switch-icon-a,.switch-icon-slide-end.active .switch-icon-a,.switch-icon-slide-down.active .switch-icon-a{transform:translateY(-100%)}.switch-icon-slide-up.active .switch-icon-b,.switch-icon-slide-left.active .switch-icon-b,.switch-icon-slide-start.active .switch-icon-b,.switch-icon-slide-right.active .switch-icon-b,.switch-icon-slide-end.active .switch-icon-b,.switch-icon-slide-down.active .switch-icon-b{transform:translateY(0)}.switch-icon-slide-left .switch-icon-a,.switch-icon-slide-start .switch-icon-a{transform:translate(0)}.switch-icon-slide-left .switch-icon-b,.switch-icon-slide-start .switch-icon-b{transform:translate(100%)}.switch-icon-slide-left.active .switch-icon-a,.switch-icon-slide-start.active .switch-icon-a{transform:translate(-100%)}.switch-icon-slide-left.active .switch-icon-b,.switch-icon-slide-start.active .switch-icon-b,.switch-icon-slide-right .switch-icon-a,.switch-icon-slide-end .switch-icon-a{transform:translate(0)}.switch-icon-slide-right .switch-icon-b,.switch-icon-slide-end .switch-icon-b{transform:translate(-100%)}.switch-icon-slide-right.active .switch-icon-a,.switch-icon-slide-end.active .switch-icon-a{transform:translate(100%)}.switch-icon-slide-right.active .switch-icon-b,.switch-icon-slide-end.active .switch-icon-b{transform:translate(0)}.switch-icon-slide-down .switch-icon-a{transform:translateY(0)}.switch-icon-slide-down .switch-icon-b{transform:translateY(-100%)}.switch-icon-slide-down.active .switch-icon-a{transform:translateY(100%)}.switch-icon-slide-down.active .switch-icon-b{transform:translateY(0)}.table thead th,.markdown>table thead th{background:var(--tblr-bg-surface-tertiary);font-size:.75rem;font-weight:var(--tblr-font-weight-medium);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);padding-top:.5rem;padding-bottom:.5rem;white-space:nowrap}@media print{.table thead th,.markdown>table thead th{background:transparent}}.table-responsive .table,.table-responsive .markdown>table{margin-bottom:0}.table-responsive+.card-footer{border-top:0}.table-transparent thead th{background:transparent}.table-nowrap>:not(caption)>*>*{white-space:nowrap}.table-vcenter>:not(caption)>*>*{vertical-align:middle}.table-center>:not(caption)>*>*{text-align:center}.td-truncate{max-width:1px;width:100%}.table-mobile{display:block}.table-mobile thead{display:none}.table-mobile tbody,.table-mobile tr{display:flex;flex-direction:column}.table-mobile td{display:block;padding:.5rem!important;border:none;color:var(--tblr-body-color)!important}.table-mobile td[data-label]:before{font-size:.75rem;font-weight:var(--tblr-font-weight-medium);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);content:attr(data-label);display:block}.table-mobile tr{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)}.table-mobile .btn{display:block}@media(max-width:575.98px){.table-mobile-sm{display:block}.table-mobile-sm thead{display:none}.table-mobile-sm tbody,.table-mobile-sm tr{display:flex;flex-direction:column}.table-mobile-sm td{display:block;padding:.5rem!important;border:none;color:var(--tblr-body-color)!important}.table-mobile-sm td[data-label]:before{font-size:.75rem;font-weight:var(--tblr-font-weight-medium);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);content:attr(data-label);display:block}.table-mobile-sm tr{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)}.table-mobile-sm .btn{display:block}}@media(max-width:767.98px){.table-mobile-md{display:block}.table-mobile-md thead{display:none}.table-mobile-md tbody,.table-mobile-md tr{display:flex;flex-direction:column}.table-mobile-md td{display:block;padding:.5rem!important;border:none;color:var(--tblr-body-color)!important}.table-mobile-md td[data-label]:before{font-size:.75rem;font-weight:var(--tblr-font-weight-medium);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);content:attr(data-label);display:block}.table-mobile-md tr{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)}.table-mobile-md .btn{display:block}}@media(max-width:991.98px){.table-mobile-lg{display:block}.table-mobile-lg thead{display:none}.table-mobile-lg tbody,.table-mobile-lg tr{display:flex;flex-direction:column}.table-mobile-lg td{display:block;padding:.5rem!important;border:none;color:var(--tblr-body-color)!important}.table-mobile-lg td[data-label]:before{font-size:.75rem;font-weight:var(--tblr-font-weight-medium);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);content:attr(data-label);display:block}.table-mobile-lg tr{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)}.table-mobile-lg .btn{display:block}}@media(max-width:1199.98px){.table-mobile-xl{display:block}.table-mobile-xl thead{display:none}.table-mobile-xl tbody,.table-mobile-xl tr{display:flex;flex-direction:column}.table-mobile-xl td{display:block;padding:.5rem!important;border:none;color:var(--tblr-body-color)!important}.table-mobile-xl td[data-label]:before{font-size:.75rem;font-weight:var(--tblr-font-weight-medium);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);content:attr(data-label);display:block}.table-mobile-xl tr{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)}.table-mobile-xl .btn{display:block}}@media(max-width:1399.98px){.table-mobile-xxl{display:block}.table-mobile-xxl thead{display:none}.table-mobile-xxl tbody,.table-mobile-xxl tr{display:flex;flex-direction:column}.table-mobile-xxl td{display:block;padding:.5rem!important;border:none;color:var(--tblr-body-color)!important}.table-mobile-xxl td[data-label]:before{font-size:.75rem;font-weight:var(--tblr-font-weight-medium);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);content:attr(data-label);display:block}.table-mobile-xxl tr{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)}.table-mobile-xxl .btn{display:block}}.table-sort{font:inherit;color:inherit;text-transform:inherit;letter-spacing:inherit;border:0;background:inherit;display:block;width:100%;text-align:inherit;transition:color .3s}@media(prefers-reduced-motion:reduce){.table-sort{transition:none}}.table-sort{margin:-.5rem;padding:.5rem}.table-sort:hover,.table-sort.asc,.table-sort.desc{color:var(--tblr-body-color)}.table-sort:after{content:"";display:inline-flex;width:1rem;height:1rem;vertical-align:bottom;mask-image:url("data:image/svg+xml,");background:currentColor;margin-left:.25rem}.table-sort.asc:after{mask-image:url("data:image/svg+xml,")}.table-sort.desc:after{mask-image:url("data:image/svg+xml,")}.table-borderless thead th{background:transparent}.table-selectable tbody tr .on-checked{display:none}.table-selectable tbody tr .on-unchecked{display:initial}.table-selectable tbody tr:has(.table-selectable-check:checked){background-color:var(--tblr-active-bg)}.table-selectable tbody tr:has(.table-selectable-check:checked) .on-checked{display:initial}.table-selectable tbody tr:has(.table-selectable-check:checked) .on-unchecked{display:none}.tag{--tblr-tag-height: 1.5rem;border:1px solid var(--tblr-border-color);display:inline-flex;align-items:center;height:var(--tblr-tag-height);border-radius:var(--tblr-border-radius);padding:0 .5rem;background:var(--tblr-bg-surface);box-shadow:var(--tblr-shadow-input);gap:.5rem}.tag .btn-close{margin-right:-.25rem;margin-left:-.125rem;padding:0;width:1rem;height:1rem;font-size:.5rem}.tag-badge{--tblr-badge-font-size: .625rem;--tblr-badge-padding-x: .25rem;--tblr-badge-padding-y: .125rem;margin-right:-.25rem}.tag-avatar,.tag-flag,.tag-payment,.tag-icon,.tag-check{margin-left:-.25rem}.tag-icon{color:var(--tblr-secondary);margin-right:-.125rem;width:1rem;height:1rem}.tag-check{width:1rem;height:1rem;background-size:1rem}.tags-list{--tblr-list-gap: .5rem;display:flex;flex-wrap:wrap;gap:var(--tblr-list-gap)}.toast{border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent);box-shadow:#1f29370a 0 2px 4px}.toast .toast-header{user-select:none}.toast button[data-bs-dismiss=toast]{outline:none}.toast-primary{--tblr-toast-color: #00857D}.toast-secondary{--tblr-toast-color: #6b7280}.toast-success{--tblr-toast-color: #2fb344}.toast-info{--tblr-toast-color: #4299e1}.toast-warning{--tblr-toast-color: #f59f00}.toast-danger{--tblr-toast-color: #d63939}.toast-light{--tblr-toast-color: #f9fafb}.toast-dark{--tblr-toast-color: #1f2937}.toast-muted{--tblr-toast-color: #6b7280}.toast-blue{--tblr-toast-color: #066fd1}.toast-azure{--tblr-toast-color: #4299e1}.toast-indigo{--tblr-toast-color: #4263eb}.toast-purple{--tblr-toast-color: #ae3ec9}.toast-pink{--tblr-toast-color: #d6336c}.toast-red{--tblr-toast-color: #d63939}.toast-orange{--tblr-toast-color: #f76707}.toast-yellow{--tblr-toast-color: #f59f00}.toast-lime{--tblr-toast-color: #74b816}.toast-green{--tblr-toast-color: #2fb344}.toast-teal{--tblr-toast-color: #0ca678}.toast-cyan{--tblr-toast-color: #17a2b8}.toolbar{display:flex;flex-wrap:nowrap;flex-shrink:0;margin:0 -.5rem}.toolbar>*{margin:0 .5rem}.tracking{--tblr-tracking-height: 1.5rem;--tblr-tracking-gap-width: .125rem;--tblr-tracking-block-border-radius: var(--tblr-border-radius);display:flex;gap:var(--tblr-tracking-gap-width)}.tracking-squares{--tblr-tracking-block-border-radius: var(--tblr-border-radius-sm)}.tracking-squares .tracking-block{height:auto}.tracking-squares .tracking-block:before{content:"";display:block;padding-top:100%}.tracking-block{flex:1;border-radius:var(--tblr-tracking-block-border-radius);height:var(--tblr-tracking-height);min-width:.25rem;background:var(--tblr-border-color)}.timeline{--tblr-timeline-icon-size: 2.5rem;position:relative;list-style:none;padding:0}.timeline-event{position:relative}.timeline-event:not(:last-child){margin-bottom:var(--tblr-page-padding)}.timeline-event:not(:last-child):before{content:"";position:absolute;top:var(--tblr-timeline-icon-size);left:calc(var(--tblr-timeline-icon-size) / 2);bottom:calc(-1 * var(--tblr-page-padding));width:var(--tblr-border-width);background-color:var(--tblr-border-color);border-radius:var(--tblr-border-radius)}.timeline-event-icon{position:absolute;display:flex;align-items:center;justify-content:center;width:var(--tblr-timeline-icon-size, 2.5rem);height:var(--tblr-timeline-icon-size, 2.5rem);background:var(--tblr-bg-surface-secondary);color:var(--tblr-secondary);border-radius:var(--tblr-border-radius);z-index:5}.timeline-event-card{margin-left:calc(var(--tblr-timeline-icon-size, 2.5rem) + var(--tblr-page-padding))}.timeline-simple .timeline-event-icon{display:none}.timeline-simple .timeline-event-card{margin-left:0}.hr-text{display:flex;align-items:center;margin:2rem 0;font-size:.75rem;font-weight:var(--tblr-font-weight-medium);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);height:1px}.hr-text:after,.hr-text:before{flex:1 1 auto;height:1px;background-color:var(--tblr-border-color)}.hr-text:before{content:"";margin-right:.5rem}.hr-text:after{content:"";margin-left:.5rem}.hr-text>*:first-child{padding-right:.5rem;padding-left:0;color:var(--tblr-secondary)}.hr-text.hr-text-left:before,.hr-text.hr-text-start:before{content:none}.hr-text.hr-text-left>*:first-child,.hr-text.hr-text-start>*:first-child{padding-right:.5rem;padding-left:.5rem}.hr-text.hr-text-right:before,.hr-text.hr-text-end:before{content:""}.hr-text.hr-text-right:after,.hr-text.hr-text-end:after{content:none}.hr-text.hr-text-right>*:first-child,.hr-text.hr-text-end>*:first-child{padding-right:0;padding-left:.5rem}.card>.hr-text{margin:0}.hr-text-spaceless{margin:-.5rem 0}.lead{color:var(--tblr-secondary);font-size:inherit}a{text-decoration-skip-ink:auto;color:color-mix(in srgb,transparent,var(--tblr-link-color) var(--tblr-link-opacity, 100%))}a:hover{color:color-mix(in srgb,transparent,var(--tblr-link-hover-color) var(--tblr-link-opacity, 100%))}h1 a,h2 a,h3 a,.field-group h2 a,h4 a,h5 a,h6 a,.h1 a,.h2 a,.h3 a,.h4 a,.h5 a,.h6 a,h1 a:hover,h2 a:hover,h3 a:hover,h4 a:hover,h5 a:hover,h6 a:hover,.h1 a:hover,.h2 a:hover,.h3 a:hover,.h4 a:hover,.h5 a:hover,.h6 a:hover{color:inherit}h1,.h1{font-size:var(--tblr-font-size-h1);line-height:var(--tblr-line-height-h1)}h2,.h2{font-size:var(--tblr-font-size-h2);line-height:var(--tblr-line-height-h2)}h3,.field-group h2,.field-group .h2,.h3{font-size:var(--tblr-font-size-h3);line-height:var(--tblr-line-height-h3)}h4,.h4{font-size:var(--tblr-font-size-h4);line-height:var(--tblr-line-height-h4)}h5,.h5{font-size:var(--tblr-font-size-h5);line-height:var(--tblr-line-height-h5)}h6,.h6{font-size:var(--tblr-font-size-h6);line-height:var(--tblr-line-height-h6)}.fs-base{font-size:var(--tblr-body-font-size)}strong,.strong,b{font-weight:var(--tblr-font-weight-bold)}blockquote{padding:1rem;border-left:2px var(--tblr-border-style) var(--tblr-border-color)}blockquote p{margin-bottom:1rem}blockquote cite{display:block;text-align:right}blockquote cite:before{content:"\2014 "}ul,ol{padding-left:1.5rem}hr,.hr{margin:2rem 0}dl dd:last-child{margin-bottom:0}pre{--tblr-scrollbar-color: var(--tblr-light);padding:1rem;background:var(--tblr-bg-surface-dark);color:var(--tblr-light);border-radius:var(--tblr-border-radius);line-height:1.4285714286}pre{scrollbar-color:color-mix(in srgb,var(--tblr-scrollbar-color, var(--tblr-body-color)) 20%,transparent) transparent}pre::-webkit-scrollbar{width:1rem;height:1rem;transition:background .3s}@media(prefers-reduced-motion:reduce){pre::-webkit-scrollbar{transition:none}}pre::-webkit-scrollbar-thumb{border-radius:1rem;border:5px solid transparent;box-shadow:inset 0 0 0 1rem color-mix(in srgb,var(--tblr-scrollbar-color, var(--tblr-body-color)) 20%,transparent)}pre::-webkit-scrollbar-track{background:transparent}pre:hover::-webkit-scrollbar-thumb{box-shadow:inset 0 0 0 1rem color-mix(in srgb,var(--tblr-scrollbar-color, var(--tblr-body-color)) 40%,transparent)}pre::-webkit-scrollbar-corner{background:transparent}pre code{background:transparent;padding:0}code{background:var(--tblr-code-bg);padding:2px 4px;border-radius:var(--tblr-border-radius)}abbr{text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}kbd,.kbd{border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);display:inline-block;box-sizing:border-box;max-width:100%;font-size:var(--tblr-font-size-h5);font-weight:var(--tblr-font-weight-medium);line-height:1;vertical-align:baseline;border-radius:var(--tblr-border-radius)}img{max-width:100%;height:auto}.list-unstyled{margin-left:0}::selection,.text-selected{background-color:color-mix(in srgb,var(--tblr-primary) 10%,transparent)}.text-selected{display:inline-block}[class^=link-].disabled,[class*=" link-"].disabled{color:var(--tblr-disabled-color)!important;pointer-events:none}a:hover:has(.icon){text-decoration:none}.link-hoverable{border-radius:var(--tblr-border-radius);transition:background-color .15s ease-in-out}.link-hoverable:hover{text-decoration:none;color:var(--tblr-primary);background:color-mix(in srgb,var(--tblr-secondary) 4%,transparent)}.subheader{font-size:.75rem;font-weight:var(--tblr-font-weight-medium);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary)}.mention{display:inline-block;box-shadow:var(--tblr-shadow-border);border-radius:var(--tblr-border-radius-pill);line-height:1.3333333333em;font-size:.8571428571em;color:var(--tblr-body-color);background:var(--tblr-bg-surface-tertiary);padding:.1666666667em .6666666667em;font-weight:var(--tblr-font-weight-medium)}a.mention{cursor:pointer}a.mention:hover,a.mention.hover{background:var(--tblr-bg-surface-secondary);text-decoration:underline}.mention-avatar,.mention-app,.mention-color{width:1.1666666667em;height:1.1666666667em;border-radius:var(--tblr-border-radius-pill);margin:-.1666666667em .3333333333em 0 -.3333333333em;display:inline-flex;background:no-repeat center center/cover;box-shadow:var(--tblr-shadow-border);vertical-align:middle;text-align:center}.mention-app{box-shadow:none;background:none;border-radius:0}.mention-count{color:var(--tblr-secondary);margin-left:.6666666667em}.text-incorrect{background:color-mix(in srgb,var(--tblr-red) 4%,transparent);text-decoration:underline;text-decoration-thickness:1px;text-decoration-color:var(--tblr-red)}.text-correct{background:color-mix(in srgb,var(--tblr-green) 4%,transparent);text-decoration:underline;text-decoration-thickness:1px;text-decoration-color:var(--tblr-green)}.steps{--tblr-steps-padding: 2rem;--tblr-steps-item-size: 1.5rem;margin-left:1rem;padding-left:var(--tblr-steps-padding);counter-reset:step;border-left:1px solid var(--tblr-border-color);margin-bottom:2rem}.steps h3,.steps .field-group h2,.field-group .steps h2,.steps .field-group .h2,.field-group .steps .h2,.steps .h3{counter-increment:step}.steps h3:not(:first-child),.steps .field-group h2:not(:first-child),.field-group .steps h2:not(:first-child),.steps .field-group .h2:not(:first-child),.field-group .steps .h2:not(:first-child),.steps .h3:not(:first-child){margin-top:2.5rem!important}.steps h3:before,.steps .field-group h2:before,.field-group .steps h2:before,.steps .field-group .h2:before,.field-group .steps .h2:before,.steps .h3:before{content:counter(step);display:inline-block;position:absolute;margin-top:1px;margin-left:calc(-1 * var(--tblr-steps-padding) - var(--tblr-steps-item-size) / 2);width:var(--tblr-steps-item-size);height:var(--tblr-steps-item-size);text-align:center;color:var(--tblr-body-color);border:1px solid var(--tblr-border-color);background:var(--tblr-bg-surface);border-radius:var(--tblr-border-radius);line-height:calc(var(--tblr-steps-item-size) - 2px);font-size:var(--tblr-font-size-h4);font-weight:var(--tblr-font-weight-bold)}.steps>:last-child{margin-bottom:0}.callout{margin-bottom:1.5rem;border:1px solid var(--tblr-primary-200);border-radius:var(--tblr-border-radius);padding:.5rem 1rem;background:var(--tblr-primary-lt)}.callout>:last-child{margin-bottom:0}.chart{display:block;min-height:10rem}.chart text{font-family:inherit}.chart-sm{height:2.5rem}.chart-lg{height:15rem}.chart-square{height:5.75rem}.chart-sparkline{position:relative;width:4rem;height:2.5rem;line-height:1;min-height:0!important}.chart-sparkline-sm{height:1.5rem}.chart-sparkline-square{width:2.5rem}.chart-sparkline-wide{width:6rem}.chart-sparkline-label{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font-size:.625rem}.chart-sparkline-label .icon{width:1rem;height:1rem;font-size:1rem}.offcanvas-header{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.offcanvas-footer{padding:1.5rem}.offcanvas-title{font-size:1rem;font-weight:var(--tblr-font-weight-medium);line-height:1.5rem}.offcanvas-narrow{width:20rem}.chat-bubbles{display:flex;flex-direction:column;gap:1rem}.chat-bubble{background:var(--tblr-bg-surface-secondary);border-radius:var(--tblr-border-radius-lg);padding:1rem;position:relative}.chat-bubble-me{background-color:var(--tblr-primary-lt);box-shadow:none}.chat-bubble-title{margin-bottom:.25rem}.chat-bubble-author{font-weight:600}.chat-bubble-date{color:var(--tblr-secondary)}.chat-bubble-body>*:last-child{margin-bottom:0}.signature{--tblr-signature-padding: var(--tblr-spacer-1);--tblr-signature-border-radius: var(--tblr-border-radius);border:var(--tblr-border-width) solid var(--tblr-border-color);padding:var(--tblr-signature-padding);border-radius:var(--tblr-border-radius)}.signature-canvas{border:var(--tblr-border-width) dashed var(--tblr-border-color);border-radius:calc(var(--tblr-signature-border-radius) - var(--tblr-signature-padding));display:block;cursor:crosshair;width:100%}.clearfix:after{display:block;clear:both;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:var(--tblr-border-width);min-height:1em;background-color:currentcolor;opacity:.16}.stretched-link:after{position:absolute;inset:0;z-index:1;content:""}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute!important}.visually-hidden *,.visually-hidden-focusable:not(:focus):not(:focus-within) *{overflow:hidden!important}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media(min-width:576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width:768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width:992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width:1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width:1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:sticky;bottom:0;z-index:1020}}.ratio{position:relative;width:100%}.ratio:before{display:block;padding-top:var(--tblr-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--tblr-aspect-ratio: 100%}.ratio-2x1{--tblr-aspect-ratio: 50%}.ratio-1x2{--tblr-aspect-ratio: 200%}.ratio-3x1{--tblr-aspect-ratio: 33.3333333333%}.ratio-1x3{--tblr-aspect-ratio: 300%}.ratio-4x1{--tblr-aspect-ratio: 25%}.ratio-1x4{--tblr-aspect-ratio: 400%}.ratio-4x3{--tblr-aspect-ratio: 75%}.ratio-3x4{--tblr-aspect-ratio: 133.3333333333%}.ratio-16x9{--tblr-aspect-ratio: 56.25%}.ratio-9x16{--tblr-aspect-ratio: 177.7777777778%}.ratio-21x9{--tblr-aspect-ratio: 42.8571428571%}.ratio-9x21{--tblr-aspect-ratio: 233.3333333333%}.focus-ring:focus{outline:0;box-shadow:var(--tblr-focus-ring-x, 0) var(--tblr-focus-ring-y, 0) var(--tblr-focus-ring-blur, 0) var(--tblr-focus-ring-width) var(--tblr-focus-ring-color)}.bg-white-overlay{color:#fff;background-color:#f9fafb3d}.bg-dark-overlay{color:#fff;background-color:#1f29373d}.bg-cover{background-repeat:no-repeat;background-size:cover;background-position:center}.bg-primary{background-color:color-mix(in srgb,var(--tblr-primary) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-primary-lt{color:color-mix(in srgb,var(--tblr-primary) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-primary-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-primary{border-color:color-mix(in srgb,var(--tblr-primary) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-primary{--tblr-gradient-from: var(--tblr-primary)}.bg-gradient-to-primary{--tblr-gradient-to: var(--tblr-primary)}.bg-gradient-via-primary{--tblr-gradient-via: var(--tblr-primary);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-primary{color:#f9fafb!important;background-color:RGBA(var(--tblr-primary-rgb),var(--tblr-bg-opacity, 1))!important}.link-primary{color:color-mix(in srgb,var(--tblr-primary) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-primary) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-primary:hover,.link-primary:focus{color:RGBA(0,106,100,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(0,106,100,var(--tblr-link-underline-opacity, 1))!important}.bg-secondary{background-color:color-mix(in srgb,var(--tblr-secondary) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-secondary-lt{color:color-mix(in srgb,var(--tblr-secondary) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-secondary-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-secondary{border-color:color-mix(in srgb,var(--tblr-secondary) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-secondary{--tblr-gradient-from: var(--tblr-secondary)}.bg-gradient-to-secondary{--tblr-gradient-to: var(--tblr-secondary)}.bg-gradient-via-secondary{--tblr-gradient-via: var(--tblr-secondary);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-secondary,.text-bg-gray{color:#f9fafb!important;background-color:RGBA(var(--tblr-secondary-rgb),var(--tblr-bg-opacity, 1))!important}.link-secondary{color:color-mix(in srgb,var(--tblr-secondary) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-secondary) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-secondary:hover,.link-secondary:focus{color:RGBA(86,91,102,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(86,91,102,var(--tblr-link-underline-opacity, 1))!important}.bg-success{background-color:color-mix(in srgb,var(--tblr-success) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-success-lt{color:color-mix(in srgb,var(--tblr-success) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-success-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-success{border-color:color-mix(in srgb,var(--tblr-success) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-success{--tblr-gradient-from: var(--tblr-success)}.bg-gradient-to-success{--tblr-gradient-to: var(--tblr-success)}.bg-gradient-via-success{--tblr-gradient-via: var(--tblr-success);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-success{color:#f9fafb!important;background-color:RGBA(var(--tblr-success-rgb),var(--tblr-bg-opacity, 1))!important}.link-success{color:color-mix(in srgb,var(--tblr-success) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-success) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-success:hover,.link-success:focus{color:RGBA(38,143,54,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(38,143,54,var(--tblr-link-underline-opacity, 1))!important}.bg-info{background-color:color-mix(in srgb,var(--tblr-info) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-info-lt{color:color-mix(in srgb,var(--tblr-info) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-info-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-info{border-color:color-mix(in srgb,var(--tblr-info) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-info{--tblr-gradient-from: var(--tblr-info)}.bg-gradient-to-info{--tblr-gradient-to: var(--tblr-info)}.bg-gradient-via-info{--tblr-gradient-via: var(--tblr-info);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-info{color:#f9fafb!important;background-color:RGBA(var(--tblr-info-rgb),var(--tblr-bg-opacity, 1))!important}.link-info{color:color-mix(in srgb,var(--tblr-info) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-info) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-info:hover,.link-info:focus{color:RGBA(53,122,180,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(53,122,180,var(--tblr-link-underline-opacity, 1))!important}.bg-warning{background-color:color-mix(in srgb,var(--tblr-warning) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-warning-lt{color:color-mix(in srgb,var(--tblr-warning) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-warning-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-warning{border-color:color-mix(in srgb,var(--tblr-warning) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-warning{--tblr-gradient-from: var(--tblr-warning)}.bg-gradient-to-warning{--tblr-gradient-to: var(--tblr-warning)}.bg-gradient-via-warning{--tblr-gradient-via: var(--tblr-warning);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-warning{color:#f9fafb!important;background-color:RGBA(var(--tblr-warning-rgb),var(--tblr-bg-opacity, 1))!important}.link-warning{color:color-mix(in srgb,var(--tblr-warning) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-warning) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-warning:hover,.link-warning:focus{color:RGBA(196,127,0,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(196,127,0,var(--tblr-link-underline-opacity, 1))!important}.bg-danger{background-color:color-mix(in srgb,var(--tblr-danger) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-danger-lt{color:color-mix(in srgb,var(--tblr-danger) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-danger-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-danger{border-color:color-mix(in srgb,var(--tblr-danger) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-danger{--tblr-gradient-from: var(--tblr-danger)}.bg-gradient-to-danger{--tblr-gradient-to: var(--tblr-danger)}.bg-gradient-via-danger{--tblr-gradient-via: var(--tblr-danger);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-danger{color:#f9fafb!important;background-color:RGBA(var(--tblr-danger-rgb),var(--tblr-bg-opacity, 1))!important}.link-danger{color:color-mix(in srgb,var(--tblr-danger) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-danger) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-danger:hover,.link-danger:focus{color:RGBA(171,46,46,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(171,46,46,var(--tblr-link-underline-opacity, 1))!important}.bg-light{background-color:color-mix(in srgb,var(--tblr-light) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-light-lt{color:color-mix(in srgb,var(--tblr-light) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-light-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-light{border-color:color-mix(in srgb,var(--tblr-light) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-light{--tblr-gradient-from: var(--tblr-light)}.bg-gradient-to-light{--tblr-gradient-to: var(--tblr-light)}.bg-gradient-via-light{--tblr-gradient-via: var(--tblr-light);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-light,.text-bg-white{color:#1f2937!important;background-color:RGBA(var(--tblr-light-rgb),var(--tblr-bg-opacity, 1))!important}.link-light{color:color-mix(in srgb,var(--tblr-light) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-light) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-light:hover,.link-light:focus{color:RGBA(250,251,252,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(250,251,252,var(--tblr-link-underline-opacity, 1))!important}.bg-dark{background-color:color-mix(in srgb,var(--tblr-dark) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-dark-lt{color:color-mix(in srgb,var(--tblr-dark) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-dark-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-dark{border-color:color-mix(in srgb,var(--tblr-dark) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-dark{--tblr-gradient-from: var(--tblr-dark)}.bg-gradient-to-dark{--tblr-gradient-to: var(--tblr-dark)}.bg-gradient-via-dark{--tblr-gradient-via: var(--tblr-dark);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-dark,.text-bg-black{color:#f9fafb!important;background-color:RGBA(var(--tblr-dark-rgb),var(--tblr-bg-opacity, 1))!important}.link-dark{color:color-mix(in srgb,var(--tblr-dark) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-dark) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-dark:hover,.link-dark:focus{color:RGBA(25,33,44,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(25,33,44,var(--tblr-link-underline-opacity, 1))!important}.bg-muted{background-color:color-mix(in srgb,var(--tblr-muted) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-muted-lt{color:color-mix(in srgb,var(--tblr-muted) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-muted-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-muted{border-color:color-mix(in srgb,var(--tblr-muted) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-muted{--tblr-gradient-from: var(--tblr-muted)}.bg-gradient-to-muted{--tblr-gradient-to: var(--tblr-muted)}.bg-gradient-via-muted{--tblr-gradient-via: var(--tblr-muted);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-muted{color:#f9fafb!important;background-color:RGBA(var(--tblr-muted-rgb),var(--tblr-bg-opacity, 1))!important}.link-muted{color:color-mix(in srgb,var(--tblr-muted) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-muted) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-muted:hover,.link-muted:focus{color:RGBA(86,91,102,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(86,91,102,var(--tblr-link-underline-opacity, 1))!important}.bg-blue{background-color:color-mix(in srgb,var(--tblr-blue) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-blue-lt{color:color-mix(in srgb,var(--tblr-blue) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-blue-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-blue{border-color:color-mix(in srgb,var(--tblr-blue) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-blue{--tblr-gradient-from: var(--tblr-blue)}.bg-gradient-to-blue{--tblr-gradient-to: var(--tblr-blue)}.bg-gradient-via-blue{--tblr-gradient-via: var(--tblr-blue);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-blue{color:#f9fafb!important;background-color:RGBA(var(--tblr-blue-rgb),var(--tblr-bg-opacity, 1))!important}.link-blue{color:color-mix(in srgb,var(--tblr-blue) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-blue) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-blue:hover,.link-blue:focus{color:RGBA(5,89,167,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(5,89,167,var(--tblr-link-underline-opacity, 1))!important}.bg-azure{background-color:color-mix(in srgb,var(--tblr-azure) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-azure-lt{color:color-mix(in srgb,var(--tblr-azure) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-azure-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-azure{border-color:color-mix(in srgb,var(--tblr-azure) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-azure{--tblr-gradient-from: var(--tblr-azure)}.bg-gradient-to-azure{--tblr-gradient-to: var(--tblr-azure)}.bg-gradient-via-azure{--tblr-gradient-via: var(--tblr-azure);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-azure{color:#f9fafb!important;background-color:RGBA(var(--tblr-azure-rgb),var(--tblr-bg-opacity, 1))!important}.link-azure{color:color-mix(in srgb,var(--tblr-azure) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-azure) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-azure:hover,.link-azure:focus{color:RGBA(53,122,180,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(53,122,180,var(--tblr-link-underline-opacity, 1))!important}.bg-indigo{background-color:color-mix(in srgb,var(--tblr-indigo) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-indigo-lt{color:color-mix(in srgb,var(--tblr-indigo) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-indigo-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-indigo{border-color:color-mix(in srgb,var(--tblr-indigo) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-indigo{--tblr-gradient-from: var(--tblr-indigo)}.bg-gradient-to-indigo{--tblr-gradient-to: var(--tblr-indigo)}.bg-gradient-via-indigo{--tblr-gradient-via: var(--tblr-indigo);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-indigo{color:#f9fafb!important;background-color:RGBA(var(--tblr-indigo-rgb),var(--tblr-bg-opacity, 1))!important}.link-indigo{color:color-mix(in srgb,var(--tblr-indigo) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-indigo) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-indigo:hover,.link-indigo:focus{color:RGBA(53,79,188,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(53,79,188,var(--tblr-link-underline-opacity, 1))!important}.bg-purple{background-color:color-mix(in srgb,var(--tblr-purple) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-purple-lt{color:color-mix(in srgb,var(--tblr-purple) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-purple-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-purple{border-color:color-mix(in srgb,var(--tblr-purple) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-purple{--tblr-gradient-from: var(--tblr-purple)}.bg-gradient-to-purple{--tblr-gradient-to: var(--tblr-purple)}.bg-gradient-via-purple{--tblr-gradient-via: var(--tblr-purple);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-purple{color:#f9fafb!important;background-color:RGBA(var(--tblr-purple-rgb),var(--tblr-bg-opacity, 1))!important}.link-purple{color:color-mix(in srgb,var(--tblr-purple) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-purple) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-purple:hover,.link-purple:focus{color:RGBA(139,50,161,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(139,50,161,var(--tblr-link-underline-opacity, 1))!important}.bg-pink{background-color:color-mix(in srgb,var(--tblr-pink) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-pink-lt{color:color-mix(in srgb,var(--tblr-pink) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-pink-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-pink{border-color:color-mix(in srgb,var(--tblr-pink) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-pink{--tblr-gradient-from: var(--tblr-pink)}.bg-gradient-to-pink{--tblr-gradient-to: var(--tblr-pink)}.bg-gradient-via-pink{--tblr-gradient-via: var(--tblr-pink);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-pink{color:#f9fafb!important;background-color:RGBA(var(--tblr-pink-rgb),var(--tblr-bg-opacity, 1))!important}.link-pink{color:color-mix(in srgb,var(--tblr-pink) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-pink) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-pink:hover,.link-pink:focus{color:RGBA(171,41,86,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(171,41,86,var(--tblr-link-underline-opacity, 1))!important}.bg-red{background-color:color-mix(in srgb,var(--tblr-red) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-red-lt{color:color-mix(in srgb,var(--tblr-red) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-red-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-red{border-color:color-mix(in srgb,var(--tblr-red) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-red{--tblr-gradient-from: var(--tblr-red)}.bg-gradient-to-red{--tblr-gradient-to: var(--tblr-red)}.bg-gradient-via-red{--tblr-gradient-via: var(--tblr-red);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-red{color:#f9fafb!important;background-color:RGBA(var(--tblr-red-rgb),var(--tblr-bg-opacity, 1))!important}.link-red{color:color-mix(in srgb,var(--tblr-red) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-red) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-red:hover,.link-red:focus{color:RGBA(171,46,46,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(171,46,46,var(--tblr-link-underline-opacity, 1))!important}.bg-orange{background-color:color-mix(in srgb,var(--tblr-orange) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-orange-lt{color:color-mix(in srgb,var(--tblr-orange) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-orange-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-orange{border-color:color-mix(in srgb,var(--tblr-orange) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-orange{--tblr-gradient-from: var(--tblr-orange)}.bg-gradient-to-orange{--tblr-gradient-to: var(--tblr-orange)}.bg-gradient-via-orange{--tblr-gradient-via: var(--tblr-orange);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-orange{color:#f9fafb!important;background-color:RGBA(var(--tblr-orange-rgb),var(--tblr-bg-opacity, 1))!important}.link-orange{color:color-mix(in srgb,var(--tblr-orange) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-orange) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-orange:hover,.link-orange:focus{color:RGBA(198,82,6,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(198,82,6,var(--tblr-link-underline-opacity, 1))!important}.bg-yellow{background-color:color-mix(in srgb,var(--tblr-yellow) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-yellow-lt{color:color-mix(in srgb,var(--tblr-yellow) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-yellow-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-yellow{border-color:color-mix(in srgb,var(--tblr-yellow) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-yellow{--tblr-gradient-from: var(--tblr-yellow)}.bg-gradient-to-yellow{--tblr-gradient-to: var(--tblr-yellow)}.bg-gradient-via-yellow{--tblr-gradient-via: var(--tblr-yellow);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-yellow{color:#f9fafb!important;background-color:RGBA(var(--tblr-yellow-rgb),var(--tblr-bg-opacity, 1))!important}.link-yellow{color:color-mix(in srgb,var(--tblr-yellow) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-yellow) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-yellow:hover,.link-yellow:focus{color:RGBA(196,127,0,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(196,127,0,var(--tblr-link-underline-opacity, 1))!important}.bg-lime{background-color:color-mix(in srgb,var(--tblr-lime) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-lime-lt{color:color-mix(in srgb,var(--tblr-lime) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-lime-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-lime{border-color:color-mix(in srgb,var(--tblr-lime) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-lime{--tblr-gradient-from: var(--tblr-lime)}.bg-gradient-to-lime{--tblr-gradient-to: var(--tblr-lime)}.bg-gradient-via-lime{--tblr-gradient-via: var(--tblr-lime);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-lime{color:#f9fafb!important;background-color:RGBA(var(--tblr-lime-rgb),var(--tblr-bg-opacity, 1))!important}.link-lime{color:color-mix(in srgb,var(--tblr-lime) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-lime) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-lime:hover,.link-lime:focus{color:RGBA(93,147,18,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(93,147,18,var(--tblr-link-underline-opacity, 1))!important}.bg-green{background-color:color-mix(in srgb,var(--tblr-green) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-green-lt{color:color-mix(in srgb,var(--tblr-green) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-green-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-green{border-color:color-mix(in srgb,var(--tblr-green) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-green{--tblr-gradient-from: var(--tblr-green)}.bg-gradient-to-green{--tblr-gradient-to: var(--tblr-green)}.bg-gradient-via-green{--tblr-gradient-via: var(--tblr-green);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-green{color:#f9fafb!important;background-color:RGBA(var(--tblr-green-rgb),var(--tblr-bg-opacity, 1))!important}.link-green{color:color-mix(in srgb,var(--tblr-green) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-green) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-green:hover,.link-green:focus{color:RGBA(38,143,54,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(38,143,54,var(--tblr-link-underline-opacity, 1))!important}.bg-teal{background-color:color-mix(in srgb,var(--tblr-teal) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-teal-lt{color:color-mix(in srgb,var(--tblr-teal) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-teal-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-teal{border-color:color-mix(in srgb,var(--tblr-teal) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-teal{--tblr-gradient-from: var(--tblr-teal)}.bg-gradient-to-teal{--tblr-gradient-to: var(--tblr-teal)}.bg-gradient-via-teal{--tblr-gradient-via: var(--tblr-teal);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-teal{color:#f9fafb!important;background-color:RGBA(var(--tblr-teal-rgb),var(--tblr-bg-opacity, 1))!important}.link-teal{color:color-mix(in srgb,var(--tblr-teal) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-teal) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-teal:hover,.link-teal:focus{color:RGBA(10,133,96,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(10,133,96,var(--tblr-link-underline-opacity, 1))!important}.bg-cyan{background-color:color-mix(in srgb,var(--tblr-cyan) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-cyan-lt{color:color-mix(in srgb,var(--tblr-cyan) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-cyan-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-cyan{border-color:color-mix(in srgb,var(--tblr-cyan) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-cyan{--tblr-gradient-from: var(--tblr-cyan)}.bg-gradient-to-cyan{--tblr-gradient-to: var(--tblr-cyan)}.bg-gradient-via-cyan{--tblr-gradient-via: var(--tblr-cyan);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-cyan{color:#f9fafb!important;background-color:RGBA(var(--tblr-cyan-rgb),var(--tblr-bg-opacity, 1))!important}.link-cyan{color:color-mix(in srgb,var(--tblr-cyan) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-cyan) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-cyan:hover,.link-cyan:focus{color:RGBA(18,130,147,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(18,130,147,var(--tblr-link-underline-opacity, 1))!important}.bg-white{background-color:color-mix(in srgb,var(--tblr-white) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-white-lt{color:color-mix(in srgb,var(--tblr-white) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-white-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-white{border-color:color-mix(in srgb,var(--tblr-white) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-white{--tblr-gradient-from: var(--tblr-white)}.bg-gradient-to-white{--tblr-gradient-to: var(--tblr-white)}.bg-gradient-via-white{--tblr-gradient-via: var(--tblr-white);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-white{color:#1f2937!important;background-color:RGBA(var(--tblr-white-rgb),var(--tblr-bg-opacity, 1))!important}.link-white{color:color-mix(in srgb,var(--tblr-white) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-white) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-white:hover,.link-white:focus{color:RGBA(255,255,255,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(255,255,255,var(--tblr-link-underline-opacity, 1))!important}.text-primary{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-primary) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-primary-fg{color:var(--tblr-primary-fg)!important}.text-secondary{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-secondary) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-secondary-fg{color:var(--tblr-secondary-fg)!important}.text-success{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-success) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-success-fg{color:var(--tblr-success-fg)!important}.text-info{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-info) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-info-fg{color:var(--tblr-info-fg)!important}.text-warning{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-warning) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-warning-fg{color:var(--tblr-warning-fg)!important}.text-danger{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-danger) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-danger-fg{color:var(--tblr-danger-fg)!important}.text-light{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-light) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-light-fg{color:var(--tblr-light-fg)!important}.text-dark{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-dark) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-dark-fg{color:var(--tblr-dark-fg)!important}.text-muted{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-muted) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-muted-fg{color:var(--tblr-muted-fg)!important}.text-blue{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-blue) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-blue-fg{color:var(--tblr-blue-fg)!important}.text-azure{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-azure) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-azure-fg{color:var(--tblr-azure-fg)!important}.text-indigo{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-indigo) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-indigo-fg{color:var(--tblr-indigo-fg)!important}.text-purple{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-purple) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-purple-fg{color:var(--tblr-purple-fg)!important}.text-pink{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-pink) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-pink-fg{color:var(--tblr-pink-fg)!important}.text-red{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-red) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-red-fg{color:var(--tblr-red-fg)!important}.text-orange{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-orange) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-orange-fg{color:var(--tblr-orange-fg)!important}.text-yellow{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-yellow) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-yellow-fg{color:var(--tblr-yellow-fg)!important}.text-lime{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-lime) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-lime-fg{color:var(--tblr-lime-fg)!important}.text-green{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-green) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-green-fg{color:var(--tblr-green-fg)!important}.text-teal{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-teal) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-teal-fg{color:var(--tblr-teal-fg)!important}.text-cyan{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-cyan) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-cyan-fg{color:var(--tblr-cyan-fg)!important}.bg-gray-50{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-gray-50) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-gray-50-fg{color:var(--tblr-gray-50-fg)!important}.bg-gray-100{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-gray-100) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-gray-100-fg{color:var(--tblr-gray-100-fg)!important}.bg-gray-200{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-gray-200) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-gray-200-fg{color:var(--tblr-gray-200-fg)!important}.bg-gray-300{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-gray-300) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-gray-300-fg{color:var(--tblr-gray-300-fg)!important}.bg-gray-400{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-gray-400) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-gray-400-fg{color:var(--tblr-gray-400-fg)!important}.bg-gray-500{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-gray-500) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-gray-500-fg{color:var(--tblr-gray-500-fg)!important}.bg-gray-600{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-gray-600) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-gray-600-fg{color:var(--tblr-gray-600-fg)!important}.bg-gray-700{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-gray-700) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-gray-700-fg{color:var(--tblr-gray-700-fg)!important}.bg-gray-800{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-gray-800) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-gray-800-fg{color:var(--tblr-gray-800-fg)!important}.bg-gray-900{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-gray-900) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-gray-900-fg{color:var(--tblr-gray-900-fg)!important}.bg-gray-950{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-gray-950) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-gray-950-fg{color:var(--tblr-gray-950-fg)!important}.bg-x{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-x) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-x-fg{color:var(--tblr-x-fg)!important}.bg-facebook{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-facebook) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-facebook-fg{color:var(--tblr-facebook-fg)!important}.bg-twitter{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-twitter) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-twitter-fg{color:var(--tblr-twitter-fg)!important}.bg-linkedin{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-linkedin) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-linkedin-fg{color:var(--tblr-linkedin-fg)!important}.bg-google{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-google) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-google-fg{color:var(--tblr-google-fg)!important}.bg-youtube{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-youtube) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-youtube-fg{color:var(--tblr-youtube-fg)!important}.bg-vimeo{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-vimeo) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-vimeo-fg{color:var(--tblr-vimeo-fg)!important}.bg-dribbble{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-dribbble) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-dribbble-fg{color:var(--tblr-dribbble-fg)!important}.bg-github{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-github) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-github-fg{color:var(--tblr-github-fg)!important}.bg-instagram{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-instagram) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-instagram-fg{color:var(--tblr-instagram-fg)!important}.bg-pinterest{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-pinterest) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-pinterest-fg{color:var(--tblr-pinterest-fg)!important}.bg-vk{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-vk) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-vk-fg{color:var(--tblr-vk-fg)!important}.bg-rss{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-rss) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-rss-fg{color:var(--tblr-rss-fg)!important}.bg-flickr{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-flickr) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-flickr-fg{color:var(--tblr-flickr-fg)!important}.bg-bitbucket{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-bitbucket) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-bitbucket-fg{color:var(--tblr-bitbucket-fg)!important}.bg-tabler{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-tabler) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-tabler-fg{color:var(--tblr-tabler-fg)!important}.bg-inverted{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-bg-surface-inverted) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.bg-surface{background-color:var(--tblr-bg-surface)!important}.bg-surface-secondary{background-color:var(--tblr-bg-surface-secondary)!important}.bg-surface-tertiary{background-color:var(--tblr-bg-surface-tertiary)!important}.bg-surface-backdrop{background-color:color-mix(in srgb,var(--tblr-gray-800) 24%,transparent)!important}.scrollable{overflow-x:hidden;overflow-y:auto;-webkit-overflow-scrolling:touch}.scrollable.hover{overflow-y:hidden}.scrollable.hover>*{margin-top:-1px}.scrollable.hover:hover,.scrollable.hover:focus,.scrollable.hover:active{overflow:visible;overflow-y:auto}.touch .scrollable{overflow-y:auto!important}.scroll-x,.scroll-y{overflow:hidden;-webkit-overflow-scrolling:touch}.scroll-y{overflow-y:auto}.scroll-x{overflow-x:auto}.no-scroll{overflow:hidden}.w-0{width:0!important}.h-0{height:0!important}.w-1{width:.25rem!important}.h-1{height:.25rem!important}.w-2{width:.5rem!important}.h-2{height:.5rem!important}.w-3{width:1rem!important}.h-3{height:1rem!important}.w-4{width:1.5rem!important}.h-4{height:1.5rem!important}.w-5{width:2rem!important}.h-5{height:2rem!important}.w-6{width:2.5rem!important}.h-6{height:2.5rem!important}.w-auto{width:auto!important}.h-auto{height:auto!important}.w-px{width:1px!important}.h-px{height:1px!important}.w-full{width:100%!important}.h-full{height:100%!important}.opacity-0{opacity:0!important}.opacity-5{opacity:.05!important}.opacity-10{opacity:.1!important}.opacity-15{opacity:.15!important}.opacity-20{opacity:.2!important}.opacity-25{opacity:.25!important}.opacity-30{opacity:.3!important}.opacity-35{opacity:calc(35 / 100)!important}.opacity-40{opacity:.4!important}.opacity-45{opacity:.45!important}.opacity-50{opacity:.5!important}.opacity-55{opacity:.55!important}.opacity-60{opacity:.6!important}.opacity-65{opacity:.65!important}.opacity-70{opacity:calc(70 / 100)!important}.opacity-75{opacity:.75!important}.opacity-80{opacity:.8!important}.opacity-85{opacity:.85!important}.opacity-90{opacity:.9!important}.opacity-95{opacity:calc(95 / 100)!important}.opacity-100{opacity:1!important}.hover-shadow-sm:hover{box-shadow:0 .125rem .25rem #00000013!important}.hover-shadow:hover{box-shadow:rgba(var(--tblr-body-color-rgb),.04) 0 2px 4px!important}.hover-shadow-lg:hover{box-shadow:0 1rem 3rem #0000002d!important}.hover-shadow-none:hover{box-shadow:none!important}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.hover-rotate-start,.hover-rotate-end,.hover-scale,.hover-elevate-down,.hover-elevate-up{transition:transform .3s ease}.hover-rotate-start:hover,.hover-rotate-end:hover,.hover-scale:hover,.hover-elevate-down:hover,.hover-elevate-up:hover{will-change:transform}.hover-elevate-up:hover{transform:translateY(-4px)}.hover-elevate-down:hover{transform:translateY(4px)}.hover-scale:hover{transform:scale(1.1)}.hover-rotate-end:hover{transform:rotate(4deg)}.hover-rotate-start:hover{transform:rotate(-4deg)}.ts-control{border:1px solid var(--tblr-border-color);padding:.5625rem 1rem;width:100%;overflow:hidden;position:relative;z-index:1;box-sizing:border-box;box-shadow:none;border-radius:var(--tblr-border-radius);display:flex;flex-wrap:wrap}.ts-wrapper.multi.has-items .ts-control{padding:calc(.5625rem - 1px + -0) 1rem calc(.5625rem - 4px + -0)}.full .ts-control{background-color:var(--tblr-bg-forms)}.disabled .ts-control,.disabled .ts-control *{cursor:default!important}.focus .ts-control{box-shadow:none}.ts-control>*{vertical-align:baseline;display:inline-block}.ts-wrapper.multi .ts-control>div{cursor:pointer;margin:0 3px 3px 0;padding:1px 5px;background:#efefef;color:#1f2937;border:0 solid #e5e7eb;overflow:auto}.ts-wrapper.multi .ts-control>div.active{background:#00857d;color:#fff;border:0 solid rgba(0,0,0,0)}.ts-wrapper.multi.disabled .ts-control>div,.ts-wrapper.multi.disabled .ts-control>div.active{color:#787878;background:#fff;border:0 solid white}.ts-control>input{flex:1 1 auto;min-width:7rem;display:inline-block!important;padding:0!important;min-height:0!important;max-height:none!important;max-width:100%!important;margin:0!important;text-indent:0!important;border:0 none!important;background:none!important;line-height:inherit!important;user-select:auto!important;box-shadow:none!important}.ts-control>input::-ms-clear{display:none}.ts-control>input:focus{outline:none!important}.has-items .ts-control>input{margin:0 4px!important}.ts-control.rtl{text-align:right}.ts-control.rtl.single .ts-control:after{left:calc(1rem + 5px);right:auto}.ts-control.rtl .ts-control>input{margin:0 4px 0 -2px!important}.disabled .ts-control{opacity:1;background-color:var(--tblr-bg-surface-secondary)}.input-hidden .ts-control>input{opacity:0;position:absolute;left:-10000px}.ts-dropdown{position:absolute;top:100%;left:0;width:100%;z-index:10;border:1px solid #d0d0d0;background:var(--tblr-bg-surface);margin:.25rem 0 0;border-top:0 none;box-sizing:border-box;box-shadow:0 1px 3px #0000001a;border-radius:0 0 var(--tblr-border-radius) var(--tblr-border-radius)}.ts-dropdown [data-selectable]{cursor:pointer;overflow:hidden}.ts-dropdown [data-selectable] .highlight{background:#ffed2866;border-radius:1px}.ts-dropdown .option,.ts-dropdown .optgroup-header,.ts-dropdown .no-results,.ts-dropdown .create{padding:3px 1rem}.ts-dropdown .option,.ts-dropdown [data-disabled],.ts-dropdown [data-disabled] [data-selectable].option{cursor:inherit;opacity:.5}.ts-dropdown [data-selectable].option{opacity:1;cursor:pointer}.ts-dropdown .optgroup:first-child .optgroup-header{border-top:0 none}.ts-dropdown .optgroup-header{color:#4b5563;background:var(--tblr-bg-surface);cursor:default}.ts-dropdown .active{background-color:rgba(var(--tblr-secondary-rgb),.08);color:inherit}.ts-dropdown .active.create{color:inherit}.ts-dropdown .create{color:#1f293780}.ts-dropdown .spinner{display:inline-block;width:30px;height:30px;margin:3px 1rem}.ts-dropdown .spinner:after{content:" ";display:block;width:24px;height:24px;margin:3px;border-radius:50%;border:5px solid #d0d0d0;border-color:#d0d0d0 transparent #d0d0d0 transparent;animation:lds-dual-ring 1.2s linear infinite}@keyframes lds-dual-ring{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.ts-dropdown-content{overflow:hidden auto;max-height:200px;scroll-behavior:smooth}.ts-wrapper.plugin-drag_drop .ts-dragging{color:transparent!important}.ts-wrapper.plugin-drag_drop .ts-dragging>*{visibility:hidden!important}.plugin-checkbox_options:not(.rtl) .option input{margin-right:.5rem}.plugin-checkbox_options.rtl .option input{margin-left:.5rem}.plugin-clear_button{--ts-pr-clear-button: 1em}.plugin-clear_button .clear-button{opacity:0;position:absolute;top:50%;transform:translateY(-50%);right:calc(1rem - 5px);margin-right:0!important;background:transparent!important;transition:opacity .5s;cursor:pointer}.plugin-clear_button.form-select .clear-button,.plugin-clear_button.single .clear-button{right:max(var(--ts-pr-caret),1rem)}.plugin-clear_button.focus.has-items .clear-button,.plugin-clear_button:not(.disabled):hover.has-items .clear-button{opacity:1}.ts-wrapper .dropdown-header{position:relative;padding:6px 1rem;border-bottom:1px solid #d0d0d0;background:color-mix(var(--tblr-bg-surface),#d0d0d0,85%);border-radius:var(--tblr-border-radius) var(--tblr-border-radius) 0 0}.ts-wrapper .dropdown-header-close{position:absolute;right:1rem;top:50%;color:#1f2937;opacity:.4;margin-top:-12px;line-height:20px;font-size:20px!important}.ts-wrapper .dropdown-header-close:hover{color:#000}.plugin-dropdown_input.focus.dropdown-active .ts-control{box-shadow:none;border:1px solid var(--tblr-border-color);box-shadow:var(--tblr-shadow-input)}.plugin-dropdown_input .dropdown-input{border:1px solid #d0d0d0;border-width:0 0 1px;display:block;padding:.5625rem 1rem;box-shadow:none;width:100%;background:transparent}.plugin-dropdown_input.focus .ts-dropdown .dropdown-input{border-color:#80c2be;outline:0;box-shadow:var(--tblr-shadow-input),0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.plugin-dropdown_input .items-placeholder{border:0 none!important;box-shadow:none!important;width:100%}.plugin-dropdown_input.has-items .items-placeholder,.plugin-dropdown_input.dropdown-active .items-placeholder{display:none!important}.ts-wrapper.plugin-input_autogrow.has-items .ts-control>input{min-width:0}.ts-wrapper.plugin-input_autogrow.has-items.focus .ts-control>input{flex:none;min-width:4px}.ts-wrapper.plugin-input_autogrow.has-items.focus .ts-control>input::placeholder{color:transparent}.ts-dropdown.plugin-optgroup_columns .ts-dropdown-content{display:flex}.ts-dropdown.plugin-optgroup_columns .optgroup{border-right:1px solid #f2f2f2;border-top:0 none;flex-grow:1;flex-basis:0;min-width:0}.ts-dropdown.plugin-optgroup_columns .optgroup:last-child{border-right:0 none}.ts-dropdown.plugin-optgroup_columns .optgroup:before{display:none}.ts-dropdown.plugin-optgroup_columns .optgroup-header{border-top:0 none}.ts-wrapper.plugin-remove_button .item{display:inline-flex;align-items:center}.ts-wrapper.plugin-remove_button .item .remove{color:inherit;text-decoration:none;vertical-align:middle;display:inline-block;padding:0 5px;border-radius:0 2px 2px 0;box-sizing:border-box}.ts-wrapper.plugin-remove_button .item .remove:hover{background:#0000000d}.ts-wrapper.plugin-remove_button.disabled .item .remove:hover{background:none}.ts-wrapper.plugin-remove_button .remove-single{position:absolute;right:0;top:0;font-size:23px}.ts-wrapper.plugin-remove_button:not(.rtl) .item{padding-right:0!important}.ts-wrapper.plugin-remove_button:not(.rtl) .item .remove{border-left:1px solid #e5e7eb;margin-left:5px}.ts-wrapper.plugin-remove_button:not(.rtl) .item.active .remove{border-left-color:#0000}.ts-wrapper.plugin-remove_button:not(.rtl).disabled .item .remove{border-left-color:#fff}.ts-wrapper.plugin-remove_button.rtl .item{padding-left:0!important}.ts-wrapper.plugin-remove_button.rtl .item .remove{border-right:1px solid #e5e7eb;margin-right:5px}.ts-wrapper.plugin-remove_button.rtl .item.active .remove{border-right-color:#0000}.ts-wrapper.plugin-remove_button.rtl.disabled .item .remove{border-right-color:#fff}:root{--ts-pr-clear-button: 0px;--ts-pr-caret: 0px;--ts-pr-min: .75rem}.ts-wrapper.single .ts-control,.ts-wrapper.single .ts-control input{cursor:pointer}.ts-control:not(.rtl){padding-right:max(var(--ts-pr-min),var(--ts-pr-clear-button) + var(--ts-pr-caret))!important}.ts-control.rtl{padding-left:max(var(--ts-pr-min),var(--ts-pr-clear-button) + var(--ts-pr-caret))!important}.ts-wrapper{position:relative}.ts-dropdown,.ts-control,.ts-control input{color:#1f2937;font-family:inherit;font-size:inherit;line-height:1.25rem}.ts-control,.ts-wrapper.single.input-active .ts-control{background:var(--tblr-bg-forms);cursor:text}.ts-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;clip-path:inset(50%)!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important;white-space:nowrap!important}.ts-dropdown,.ts-dropdown.form-control,.ts-dropdown.form-select{height:auto;padding:0;z-index:1000;background:var(--tblr-bg-surface);border:1px solid var(--tblr-border-color-translucent);border-radius:6px;box-shadow:0 6px 12px #0000002d}.ts-dropdown .optgroup-header{font-size:.765625rem;line-height:1.4285714286}.ts-dropdown .optgroup:first-child:before{display:none}.ts-dropdown .optgroup:before{content:" ";display:block;height:0;margin:var(--tblr-spacer-2) 0;overflow:hidden;border-top:1px solid var(--tblr-border-color-translucent);margin-left:-1rem;margin-right:-1rem}.ts-dropdown .create{padding-left:1rem}.ts-dropdown-content{padding:5px 0}.ts-control{box-shadow:var(--tblr-shadow-input);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.ts-control{transition:none}}.ts-control{display:flex;align-items:center}.focus .ts-control{border-color:#80c2be;outline:0;box-shadow:var(--tblr-shadow-input),0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.ts-control .item{display:flex;align-items:center}.ts-control input::placeholder{color:var(--bs-secondary-color, #a7aeb8);opacity:1}.ts-wrapper.is-invalid,select.tomselected.is-invalid+div.ts-wrapper,.was-validated .invalid,.was-validated :invalid+.ts-wrapper{border-color:var(--tblr-form-invalid-color)}.ts-wrapper.is-invalid:not(.single),select.tomselected.is-invalid+div.ts-wrapper:not(.single),.was-validated .invalid:not(.single),.was-validated :invalid+.ts-wrapper:not(.single){background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23d63939' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cline x1='18' y1='6' x2='6' y2='18'%3e%3c/line%3e%3cline x1='6' y1='6' x2='18' y2='18'%3e%3c/line%3e%3c/svg%3e");background-position:right 1.53125rem center;background-size:1.8125rem 1.8125rem;background-repeat:no-repeat}.ts-wrapper.is-invalid.single,select.tomselected.is-invalid+div.ts-wrapper.single,.was-validated .invalid.single,.was-validated :invalid+.ts-wrapper.single{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%239ca3af' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23d63939' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cline x1='18' y1='6' x2='6' y2='18'%3e%3c/line%3e%3cline x1='6' y1='6' x2='18' y2='18'%3e%3c/line%3e%3c/svg%3e");background-position:right 1rem center,center right 3rem;background-size:16px 12px,1.8125rem 1.8125rem;background-repeat:no-repeat}.ts-wrapper.is-invalid.focus .ts-control,select.tomselected.is-invalid+div.ts-wrapper.focus .ts-control,.was-validated .invalid.focus .ts-control,.was-validated :invalid+.ts-wrapper.focus .ts-control{border-color:var(--tblr-form-invalid-color);box-shadow:0 0 0 .25rem rgba(var(--tblr-form-invalid-color),.25)}.ts-wrapper.is-valid,.was-validated .valid,.was-validated :valid+.ts-wrapper{border-color:var(--tblr-form-valid-color)}.ts-wrapper.is-valid:not(.single),.was-validated .valid:not(.single),.was-validated :valid+.ts-wrapper:not(.single){background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%232fb344' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='20 6 9 17 4 12'%3e%3c/polyline%3e%3c/svg%3e");background-position:right 1.53125rem center;background-size:1.8125rem 1.8125rem;background-repeat:no-repeat}.ts-wrapper.is-valid.single,.was-validated .valid.single,.was-validated :valid+.ts-wrapper.single{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%239ca3af' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%232fb344' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='20 6 9 17 4 12'%3e%3c/polyline%3e%3c/svg%3e");background-position:right 1rem center,center right 3rem;background-size:16px 12px,1.8125rem 1.8125rem;background-repeat:no-repeat}.ts-wrapper.is-valid.focus .ts-control,.was-validated .valid.focus .ts-control,.was-validated :valid+.ts-wrapper.focus .ts-control{border-color:var(--tblr-form-valid-color);box-shadow:0 0 0 .25rem rgba(var(--tblr-form-valid-color),.25)}.ts-wrapper{min-height:calc(1.25rem + 1.125rem + calc(var(--tblr-border-width) * 2));display:flex}.input-group-sm>.ts-wrapper,.ts-wrapper.form-select-sm,.ts-wrapper.form-control-sm{min-height:calc(1.25rem + .625rem + calc(var(--tblr-border-width) * 2))}.input-group-sm>.ts-wrapper .ts-control,.ts-wrapper.form-select-sm .ts-control,.ts-wrapper.form-control-sm .ts-control{border-radius:var(--tblr-border-radius-sm);font-size:.75rem}.input-group-sm>.ts-wrapper.has-items .ts-control,.ts-wrapper.form-select-sm.has-items .ts-control,.ts-wrapper.form-control-sm.has-items .ts-control{font-size:.75rem}.input-group-sm>.ts-wrapper.multi.has-items .ts-control,.ts-wrapper.form-select-sm.multi.has-items .ts-control,.ts-wrapper.form-control-sm.multi.has-items .ts-control{padding-top:calc((calc(1.25rem + .625rem + calc(var(--tblr-border-width) * 2)) - 1.25rem * .75rem - calc((var(--tblr-border-width) + 1px) * 2)) / 2)!important}.ts-wrapper.multi.has-items .ts-control{padding-left:calc(1rem - 5px);--ts-pr-min: calc(1rem - 5px) }.ts-wrapper.multi .ts-control>div{border-radius:calc(var(--tblr-border-radius) - 1px)}.input-group-lg>.ts-wrapper,.ts-wrapper.form-control-lg,.ts-wrapper.form-select-lg{min-height:calc(1.25rem + 1.375rem + calc(var(--tblr-border-width) * 2))}.input-group-lg>.ts-wrapper .ts-control,.ts-wrapper.form-control-lg .ts-control,.ts-wrapper.form-select-lg .ts-control{border-radius:var(--tblr-border-radius-lg);font-size:1rem}.ts-wrapper:not(.form-control,.form-select){padding:0;border:none;height:auto;box-shadow:none;background:none}.ts-wrapper:not(.form-control,.form-select).single .ts-control{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%239ca3af' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right 1rem center;background-size:16px 12px}.ts-wrapper.form-select,.ts-wrapper.single{--ts-pr-caret: 3rem}.ts-wrapper.form-control,.ts-wrapper.form-select{padding:0!important;height:auto;box-shadow:none;display:flex}.ts-wrapper.form-control .ts-control,.ts-wrapper.form-control.single.input-active .ts-control,.ts-wrapper.form-select .ts-control,.ts-wrapper.form-select.single.input-active .ts-control{border:none!important}.ts-wrapper.form-control:not(.disabled) .ts-control,.ts-wrapper.form-control:not(.disabled).single.input-active .ts-control,.ts-wrapper.form-select:not(.disabled) .ts-control,.ts-wrapper.form-select:not(.disabled).single.input-active .ts-control{background:transparent!important}.input-group>.ts-wrapper{flex-grow:1;width:1%}.input-group>.ts-wrapper:not(:nth-child(2))>.ts-control{border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.ts-wrapper:not(:last-child)>.ts-control{border-top-right-radius:0;border-bottom-right-radius:0}.form-select .ts-dropdown,.form-select .ts-control,.form-select .ts-control input{color:var(--tblr-body-color)}:root{--ts-pr-clear-button: 0rem;--ts-pr-caret: 0rem}.ts-input{color:inherit}.focus .ts-control{border-radius:var(--tblr-border-radius)}.ts-control{color:inherit}.ts-control .dropdown-menu{width:100%;height:auto}.ts-wrapper .form-control,.ts-wrapper .form-select,.ts-wrapper.form-control,.ts-wrapper.form-select{box-shadow:var(--tblr-shadow-input)}.ts-wrapper.is-invalid .ts-control,select.tomselected.is-invalid+div.ts-wrapper .ts-control,.ts-wrapper.is-valid .ts-control{--ts-pr-clear-button: 1.5rem}.ts-dropdown{background:var(--tblr-bg-surface);color:var(--tblr-body-color);box-shadow:var(--tblr-shadow-dropdown);z-index:1000}.ts-dropdown .option{padding:.5rem .75rem}.ts-control,.ts-control input{color:var(--tblr-body-color)}.ts-control input::placeholder{color:var(--tblr-tertiary)}.ts-wrapper.multi .ts-control>div,.ts-wrapper.multi.disabled .ts-control>div{background:var(--tblr-bg-surface-secondary);border:1px solid var(--tblr-border-color);color:var(--tblr-body-color)}.ts-wrapper.disabled .ts-control{opacity:1}.ts-wrapper.disabled .ts-control>div.item{color:var(--tblr-gray-500)}html{scroll-behavior:auto!important}mark,.mark{padding-left:0;padding-right:0}.table-responsive .dropdown,.table-responsive .btn-group,.table-responsive .btn-group-vertical{position:static}.progress{min-width:80px}hr.dropdown-divider,.dropdown-divider.hr{margin-bottom:.25rem;margin-top:.25rem}.dropdown-item{font-weight:400}*{font-feature-settings:"liga" 0;font-variant-ligatures:none}@media(min-width:992px){:root,:host{margin-left:0;scrollbar-gutter:stable}}pre{background-color:transparent;color:inherit}.alert{background:var(--tblr-bg-surface)}.badge{user-select:text}.btn{display:inline-block}.btn:focus{border:1px solid var(--tblr-primary-fg);outline:2px solid var(--tblr-primary)!important}.btn-sm,.btn-group-sm>.btn{border-radius:6px}.dropdown-item{display:inline-block}.footer .text-primary{color:#001423!important}.nav-tabs .nav-link{display:inline-block}.page,.page-tabs .nav-tabs .nav-link.active{background-color:var(--tblr-bg-surface-tertiary)!important}.navbar{--tblr-navbar-active-bg: rgba(0, 0, 0, .06)}[data-bs-theme=dark],body[data-bs-theme=dark] [data-bs-theme=light]{--tblr-alert-color: darken(var(--tblr-warning),10%);--tblr-link-color: #00F2D4;--tblr-link-color-rgb: 0,242,212;--tblr-link-hover-color-rgb: 0,242,212;--tblr-secondary: #9ca3af;--tblr-primary: #00F2D4;--tblr-primary-fg: #001423;--tblr-primary-rgb: 0,242,212;--tblr-btn-active-color: #001423}html[data-bs-theme=dark] ::selection,body[data-bs-theme=dark] html[data-bs-theme=light] ::selection{background-color:rgba(var(--tblr-primary-rgb),.48)}html[data-bs-theme=dark] .btn-primary,body[data-bs-theme=dark] html[data-bs-theme=light] .btn-primary,html[data-bs-theme=dark] .bg-primary .card-title,body[data-bs-theme=dark] html[data-bs-theme=light] .bg-primary .card-title,html[data-bs-theme=dark] .bg-primary a,body[data-bs-theme=dark] html[data-bs-theme=light] .bg-primary a,html[data-bs-theme=dark] .bg-primary i,body[data-bs-theme=dark] html[data-bs-theme=light] .bg-primary i,html[data-bs-theme=dark] .text-bg-primary,body[data-bs-theme=dark] html[data-bs-theme=light] .text-bg-primary{color:#001423!important}html[data-bs-theme=dark] .card,body[data-bs-theme=dark] html[data-bs-theme=light] .card{background:#001423!important}html[data-bs-theme=dark],body[data-bs-theme=dark] html[data-bs-theme=light],html[data-bs-theme=dark] .navbar,body[data-bs-theme=dark] html[data-bs-theme=light] .navbar,html[data-bs-theme=dark] .page-header,body[data-bs-theme=dark] html[data-bs-theme=light] .page-header{background-color:#001423}html[data-bs-theme=dark] .page,body[data-bs-theme=dark] html[data-bs-theme=light] .page,html[data-bs-theme=dark] .page-tabs .nav-tabs .nav-link.active,body[data-bs-theme=dark] html[data-bs-theme=light] .page-tabs .nav-tabs .nav-link.active{background-color:#081b2a!important}html[data-bs-theme=dark] .page-link.active,body[data-bs-theme=dark] html[data-bs-theme=light] .page-link.active,html[data-bs-theme=dark] .active>.page-link,body[data-bs-theme=dark] html[data-bs-theme=light] .active>.page-link{color:#001423}html[data-bs-theme=dark] .text-bg-primary,body[data-bs-theme=dark] html[data-bs-theme=light] .text-bg-primary{color:#001423!important}html[data-bs-theme=dark] .text-muted,body[data-bs-theme=dark] html[data-bs-theme=light] .text-muted{color:var(--tblr-secondary-color)!important}html[data-bs-theme=dark] .text-secondary,body[data-bs-theme=dark] html[data-bs-theme=light] .text-secondary{color:#9ca3af!important}html[data-bs-theme=dark] .footer .text-primary,body[data-bs-theme=dark] html[data-bs-theme=light] .footer .text-primary{color:#fff!important}html[data-bs-theme=dark] .toast,body[data-bs-theme=dark] html[data-bs-theme=light] .toast{color:var(--tblr-body-color)}html[data-bs-theme=dark] .table-primary,body[data-bs-theme=dark] html[data-bs-theme=light] .table-primary{--tblr-table-bg: rgba(var(--tblr-secondary-rgb), .48);--tblr-table-hover-bg: inherit;--tblr-table-hover-color: inherit}pre code{padding:unset}.dropdown-toggle:after{font-family:Material Design Icons;content:"\f0140";padding-right:9px;border-bottom:none;border-left:none;transform:none;vertical-align:.05em;height:auto}:root:not(.dummy)[data-bs-theme=light] .hide-theme-light,:root:not(.dummy)[data-bs-theme=dark] .hide-theme-dark,body[data-bs-theme=dark] [data-bs-theme=light]:root:not(.dummy) .hide-theme-dark{display:none!important}:root:not(.dummy)[data-bs-theme=dark] .hide-theme-light,body[data-bs-theme=dark] [data-bs-theme=light]:root:not(.dummy) .hide-theme-light,:root:not(.dummy)[data-bs-theme=light] .hide-theme-dark{display:inline-flex!important}.ts-wrapper.multi .ts-control{padding:7px 7px 3px}.ts-wrapper.multi .ts-control div{margin:0 4px 4px 0}.badge a{color:inherit;text-decoration:none}.page-body .card{margin-bottom:1rem}.page-body .card .card-header,.page-body .card .card-body,.page-body .card .card-footer{padding:.75rem}.page-body .card .card-header{background:var(--tblr-bg-surface-tertiary)}.page-body .card h2.card-header,.page-body .card .card-header.h2{font-size:var(--tblr-font-size-h5);line-height:var(--tblr-line-height-h5);margin-bottom:0}.page-body .card .list-group-item{padding:.5rem .75rem}.page-body .card .table,.page-body .card .markdown>table{margin-bottom:0}form.object-edit{margin:auto;max-width:800px}.col-form-label.required{font-weight:700}.col-form-label.required:after{position:absolute;display:inline-block;margin-left:0;font-family:Material Design Icons;font-size:8px;content:"\f06c4"}.has-errors input,.has-errors select,.has-errors textarea{border:1px solid #d63939}select[multiple] optgroup{top:0;background-color:var(--bs-body-bg);font-style:normal;font-weight:700}select[multiple] option{padding-left:.5rem}.modifier-select{min-width:10rem;max-width:15rem;width:auto;white-space:nowrap}.page{background-color:var(--tblr-bg-surface-secondary)}.page-header{background-color:var(--tblr-bg-surface);min-height:0}.navbar-vertical.navbar-expand-lg .navbar-collapse .nav-link-icon,.navbar-vertical.navbar-expand-lg .navbar-collapse .nav-link-title{color:#001423}.navbar-vertical.navbar-expand-lg .navbar-collapse .text-secondary{color:#00857d!important}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item a{color:#001423}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item .btn-group{visibility:hidden}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item:hover,.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item.active{background-color:var(--tblr-navbar-active-bg)}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item:hover a,.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item.active a{text-decoration:none}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item:hover .btn-group,.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item.active .btn-group{visibility:visible}.navbar-vertical.navbar-expand-lg .navbar-nav{z-index:1}@media(max-width:991.98px){.navbar-vertical.navbar-expand-lg .navbar-brand{padding:.2rem 0}}.navbar-vertical.navbar-expand-lg .navbar-brand a:hover{text-decoration:none}.navbar-vertical.navbar-expand-lg img.motif{bottom:0;display:none;left:0;mask-image:linear-gradient(180deg,#0000,#0000004d);opacity:.5;position:fixed;user-drag:none;user-select:none;-moz-user-select:none;-webkit-user-drag:none;-webkit-user-select:none;-ms-user-select:none;width:18rem}@media(min-width:992px){.navbar-vertical.navbar-expand-lg img.motif{display:block}}html[data-bs-theme=light] .navbar-vertical.navbar-expand-lg{background:linear-gradient(180deg,#00857d00,#00857d1a),#fff}html[data-bs-theme=dark] .navbar-vertical.navbar-expand-lg,body[data-bs-theme=dark] html[data-bs-theme=light] .navbar-vertical.navbar-expand-lg{background:linear-gradient(180deg,#00f2d400,#00f2d41a),#001423}html[data-bs-theme=dark] .navbar-vertical.navbar-expand-lg .nav-item.dropdown.active:after,body[data-bs-theme=dark] html[data-bs-theme=light] .navbar-vertical.navbar-expand-lg .nav-item.dropdown.active:after{border-color:#00f2d4!important}html[data-bs-theme=dark] .navbar-vertical.navbar-expand-lg .nav-link-title,body[data-bs-theme=dark] html[data-bs-theme=light] .navbar-vertical.navbar-expand-lg .nav-link-title,html[data-bs-theme=dark] .navbar-vertical.navbar-expand-lg .nav-link-icon,body[data-bs-theme=dark] html[data-bs-theme=light] .navbar-vertical.navbar-expand-lg .nav-link-icon,html[data-bs-theme=dark] .navbar-vertical.navbar-expand-lg .dropdown-item a,body[data-bs-theme=dark] html[data-bs-theme=light] .navbar-vertical.navbar-expand-lg .dropdown-item a{color:#fff!important}html[data-bs-theme=dark] .navbar-vertical.navbar-expand-lg .dropdown-item.active,body[data-bs-theme=dark] html[data-bs-theme=light] .navbar-vertical.navbar-expand-lg .dropdown-item.active,html[data-bs-theme=dark] .navbar-vertical.navbar-expand-lg .dropdown-item:hover,body[data-bs-theme=dark] html[data-bs-theme=light] .navbar-vertical.navbar-expand-lg .dropdown-item:hover{background-color:#ffffff0f!important}html[data-bs-theme=dark] .navbar-vertical.navbar-expand-lg .text-secondary,body[data-bs-theme=dark] html[data-bs-theme=light] .navbar-vertical.navbar-expand-lg .text-secondary{color:#00f2d4!important}html[data-bs-theme=dark] .navbar-vertical.navbar-expand-lg img.motif,body[data-bs-theme=dark] html[data-bs-theme=light] .navbar-vertical.navbar-expand-lg img.motif{opacity:.25}.progress{height:20px}.progress .progress-label{display:flex;flex-direction:column;justify-content:center;padding-left:.25rem}.table thead th,.markdown>table thead th{font-size:.625rem}table.object-list tbody>tr:last-child>td{border-bottom-width:0}table.object-list th.asc>a:after{content:"\f0140";font-family:Material Design Icons}table.object-list th.desc>a:after{content:"\f0143";font-family:Material Design Icons}table.attr-table th{font-weight:400;width:min-content}table.attr-table th,table.attr-table td{border-bottom-style:dashed}table.attr-table tr:last-child{border-bottom-style:hidden}table.attr-table td{overflow-wrap:anywhere}td pre{margin-bottom:0}table th.orderable a{color:var(--tblr-body-color)}html[data-bs-theme=dark] .table thead th,body[data-bs-theme=dark] html[data-bs-theme=light] .table thead th,body[data-bs-theme=dark] html[data-bs-theme=light] .markdown>table thead th,html[data-bs-theme=dark] .markdown>table thead th{background:#001423!important}.page-tabs{border-bottom:1px solid var(--tblr-border-color-translucent)}.page-tabs .nav-tabs{position:relative;border:none}.page-tabs .nav-tabs .nav-link.active,.page-tabs .nav-tabs .nav-link:active,.page-tabs .nav-tabs .nav-link:hover{border-color:var(--tblr-border-color-translucent);border-bottom-color:transparent}.page-tabs .nav-tabs .nav-link.active{color:inherit;background:var(--tblr-bg-surface-secondary);border-bottom-color:transparent}pre.change-data{border-radius:0;padding:0;margin-inline:-.75rem}pre.change-data>span{display:block;padding-inline:.5rem;max-width:100%;min-width:fit-content;border-left:.25rem solid transparent}pre.change-data>span.added{background-color:var(--tblr-green-200);border-left-color:var(--tblr-green-darken)}pre.change-data>span.removed{background-color:var(--tblr-red-200);border-left-color:var(--tblr-red-darken)}pre.change-diff{border:var(--tblr-border-width) solid transparent}pre.change-diff.change-added{background-color:var(--tblr-green-lt);border-color:var(--tblr-green)}pre.change-diff.change-removed{background-color:var(--tblr-red-lt);border-color:var(--tblr-red)}pre.block{padding:1rem;border:var(--tblr-border-width) solid #e5e7eb;border-radius:6px}.grid-stack .card-header.bg-default{background:var(--tblr-bg-surface-secondary)!important}.grid-stack .card-header a{color:inherit!important}tr[data-cable-status=connected]{background-color:#2fb34426}tr[data-cable-status=planned]{background-color:#066fd126}tr[data-cable-status=decommissioning]{background-color:#f59f0026}tr[data-mark-connected=true]{background-color:#2fb34426}tr[data-virtual=true]{background-color:#00857d26}tr[data-enabled=disabled]{background-color:#9ca3af26}tr[data-cable-status=connected] button.mark-installed{display:none}tr:not([data-cable-status=connected]) button.mark-planned{display:none}.rendered-markdown table{width:100%}.rendered-markdown table th{border-bottom:2px solid #dddddd;padding:8px}.rendered-markdown table td{border-top:1px solid #dddddd;padding:8px}.rendered-markdown table th[align=left]{text-align:left}.rendered-markdown table th[align=center]{text-align:center}.rendered-markdown table th[align=right]{text-align:right}.rendered-markdown p:last-child{margin-bottom:0}td>.rendered-markdown{max-height:200px;overflow-y:scroll}.markdown-widget .preview{border:1px solid #e5e7eb;border-radius:6px;min-height:200px}span.color-label{display:inline-block;width:5rem;height:1rem;padding:.25em .5em;border:1px solid #303030;border-radius:6px}.record-depth{display:inline;user-select:none;opacity:33%}.record-depth span:only-of-type,.record-depth span:last-of-type{margin-right:.25rem}.hide-last-child :last-child{visibility:hidden;opacity:0}.netbox-edition{letter-spacing:.15rem}.btn-float-group,.btn-float-group-right,.btn-float-group-left{position:sticky;bottom:10px;z-index:4}.btn-float-group-left{float:left}.btn-float-group-right{float:right}.btn-float{--tblr-btn-bg: var(--tblr-bg-surface-tertiary) !important}.logo{height:80px}.sso-icon{height:24px}img.plugin-icon{max-width:1.4285em;height:auto}.thumbnail{max-width:200px}.thumbnail img{border:1px solid #606060}.image-preview-popover{--bs-popover-max-width: clamp(240px, 25vw, 640px)}.image-preview-popover .popover-header{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.image-preview-popover .popover-body{display:flex;justify-content:center;align-items:center}.image-preview-popover img{display:block;max-width:100%;max-height:clamp(160px,33vh,640px);height:auto}html[data-bs-theme=dark] img.plugin-icon,body[data-bs-theme=dark] html[data-bs-theme=light] img.plugin-icon{filter:grayscale(100%) invert(100%) brightness(80%)}tr[data-read=True] td{background-color:var(--tblr-bg-surface-secondary);color:#6b7280}.rack-loading-container{min-height:200px;margin-left:30px} +@charset "UTF-8";:root,[data-bs-theme=light]{--tblr-black: #000000;--tblr-white: #ffffff;--tblr-gray: #4b5563;--tblr-gray-dark: #1f2937;--tblr-gray-100: #f3f4f6;--tblr-gray-200: #e5e7eb;--tblr-gray-300: #d1d5db;--tblr-gray-400: #9ca3af;--tblr-gray-500: #6b7280;--tblr-gray-600: #4b5563;--tblr-gray-700: #374151;--tblr-gray-800: #1f2937;--tblr-gray-900: #111827;--tblr-primary: #00857D;--tblr-secondary: #6b7280;--tblr-success: #2fb344;--tblr-info: #4299e1;--tblr-warning: #f59f00;--tblr-danger: #d63939;--tblr-light: #f9fafb;--tblr-dark: #1f2937;--tblr-muted: #6b7280;--tblr-blue: #066fd1;--tblr-azure: #4299e1;--tblr-indigo: #4263eb;--tblr-purple: #ae3ec9;--tblr-pink: #d6336c;--tblr-red: #d63939;--tblr-orange: #f76707;--tblr-yellow: #f59f00;--tblr-lime: #74b816;--tblr-green: #2fb344;--tblr-teal: #0ca678;--tblr-cyan: #17a2b8;--tblr-primary-rgb: 0, 133, 125;--tblr-secondary-rgb: 107, 114, 128;--tblr-success-rgb: 47, 179, 68;--tblr-info-rgb: 66, 153, 225;--tblr-warning-rgb: 245, 159, 0;--tblr-danger-rgb: 214, 57, 57;--tblr-light-rgb: 249, 250, 251;--tblr-dark-rgb: 31, 41, 55;--tblr-muted-rgb: 107, 114, 128;--tblr-blue-rgb: 6, 111, 209;--tblr-azure-rgb: 66, 153, 225;--tblr-indigo-rgb: 66, 99, 235;--tblr-purple-rgb: 174, 62, 201;--tblr-pink-rgb: 214, 51, 108;--tblr-red-rgb: 214, 57, 57;--tblr-orange-rgb: 247, 103, 7;--tblr-yellow-rgb: 245, 159, 0;--tblr-lime-rgb: 116, 184, 22;--tblr-green-rgb: 47, 179, 68;--tblr-teal-rgb: 12, 166, 120;--tblr-cyan-rgb: 23, 162, 184;--tblr-primary-text-emphasis: rgb(0, 53.2, 50);--tblr-secondary-text-emphasis: rgb(42.8, 45.6, 51.2);--tblr-success-text-emphasis: rgb(18.8, 71.6, 27.2);--tblr-info-text-emphasis: rgb(26.4, 61.2, 90);--tblr-warning-text-emphasis: rgb(98, 63.6, 0);--tblr-danger-text-emphasis: rgb(85.6, 22.8, 22.8);--tblr-light-text-emphasis: #374151;--tblr-dark-text-emphasis: #374151;--tblr-primary-bg-subtle: rgb(204, 230.6, 229);--tblr-secondary-bg-subtle: rgb(225.4, 226.8, 229.6);--tblr-success-bg-subtle: rgb(213.4, 239.8, 217.6);--tblr-info-bg-subtle: rgb(217.2, 234.6, 249);--tblr-warning-bg-subtle: rgb(253, 235.8, 204);--tblr-danger-bg-subtle: rgb(246.8, 215.4, 215.4);--tblr-light-bg-subtle: rgb(249, 249.5, 250.5);--tblr-dark-bg-subtle: #9ca3af;--tblr-primary-border-subtle: rgb(153, 206.2, 203);--tblr-secondary-border-subtle: rgb(195.8, 198.6, 204.2);--tblr-success-border-subtle: rgb(171.8, 224.6, 180.2);--tblr-info-border-subtle: rgb(179.4, 214.2, 243);--tblr-warning-border-subtle: rgb(251, 216.6, 153);--tblr-danger-border-subtle: rgb(238.6, 175.8, 175.8);--tblr-light-border-subtle: #e5e7eb;--tblr-dark-border-subtle: #6b7280;--tblr-white-rgb: 255, 255, 255;--tblr-black-rgb: 0, 0, 0;--tblr-font-sans-serif: "Inter", system-ui, sans-serif;--tblr-font-monospace: "Roboto Mono";--tblr-gradient: linear-gradient(180deg, rgba(255, 255, 255, .15), rgba(255, 255, 255, 0));--tblr-body-font-family: var(--tblr-font-sans-serif);--tblr-body-font-size: .875rem;--tblr-body-font-weight: 400;--tblr-body-line-height: 1.4285714286;--tblr-body-color: #1f2937;--tblr-body-color-rgb: 31, 41, 55;--tblr-body-bg: #f9fafb;--tblr-body-bg-rgb: 249, 250, 251;--tblr-emphasis-color: #374151;--tblr-emphasis-color-rgb: 55, 65, 81;--tblr-secondary-color: rgba(31, 41, 55, .75);--tblr-secondary-color-rgb: 31, 41, 55;--tblr-secondary-bg: #e5e7eb;--tblr-secondary-bg-rgb: 229, 231, 235;--tblr-tertiary-color: rgba(31, 41, 55, .5);--tblr-tertiary-color-rgb: 31, 41, 55;--tblr-tertiary-bg: #f3f4f6;--tblr-tertiary-bg-rgb: 243, 244, 246;--tblr-heading-color: inherit;--tblr-link-color: #00857D;--tblr-link-color-rgb: 0, 133, 125;--tblr-link-decoration: none;--tblr-link-hover-color: rgb(0, 106.4, 100);--tblr-link-hover-color-rgb: 0, 106, 100;--tblr-link-hover-decoration: underline;--tblr-code-color: light-dark(var(--tblr-gray-600), var(--tblr-gray-400));--tblr-highlight-color: #1f2937;--tblr-highlight-bg: rgb(253, 235.8, 204);--tblr-border-width: 1px;--tblr-border-style: solid;--tblr-border-color: #e5e7eb;--tblr-border-color-translucent: rgba(4, 32, 69, .1);--tblr-border-radius: 6px;--tblr-border-radius-sm: 4px;--tblr-border-radius-lg: 8px;--tblr-border-radius-xl: 1rem;--tblr-border-radius-xxl: 2rem;--tblr-border-radius-2xl: var(--tblr-border-radius-xxl);--tblr-border-radius-pill: 100rem;--tblr-box-shadow: rgba(var(--tblr-body-color-rgb), .04) 0 2px 4px 0;--tblr-box-shadow-sm: 0 .125rem .25rem rgba(0, 0, 0, .075);--tblr-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, .175);--tblr-box-shadow-inset: 0 0 transparent;--tblr-focus-ring-width: .25rem;--tblr-focus-ring-opacity: .25;--tblr-focus-ring-color: rgba(var(--tblr-primary-rgb), .25);--tblr-form-valid-color: #2fb344;--tblr-form-valid-border-color: #2fb344;--tblr-form-invalid-color: #d63939;--tblr-form-invalid-border-color: #d63939}[data-bs-theme=dark],body[data-bs-theme=dark] [data-bs-theme=light]{color-scheme:dark;--tblr-body-color: #e5e7eb;--tblr-body-color-rgb: 229, 231, 235;--tblr-body-bg: #111827;--tblr-body-bg-rgb: 17, 24, 39;--tblr-emphasis-color: #ffffff;--tblr-emphasis-color-rgb: 255, 255, 255;--tblr-secondary-color: rgba(229, 231, 235, .75);--tblr-secondary-color-rgb: 229, 231, 235;--tblr-secondary-bg: #1f2937;--tblr-secondary-bg-rgb: 31, 41, 55;--tblr-tertiary-color: rgba(229, 231, 235, .5);--tblr-tertiary-color-rgb: 229, 231, 235;--tblr-tertiary-bg: rgb(24, 32.5, 47);--tblr-tertiary-bg-rgb: 24, 33, 47;--tblr-primary-text-emphasis: rgb(102, 181.8, 177);--tblr-secondary-text-emphasis: rgb(166.2, 170.4, 178.8);--tblr-success-text-emphasis: rgb(130.2, 209.4, 142.8);--tblr-info-text-emphasis: rgb(141.6, 193.8, 237);--tblr-warning-text-emphasis: rgb(249, 197.4, 102);--tblr-danger-text-emphasis: rgb(230.4, 136.2, 136.2);--tblr-light-text-emphasis: #f3f4f6;--tblr-dark-text-emphasis: #d1d5db;--tblr-primary-bg-subtle: rgb(0, 26.6, 25);--tblr-secondary-bg-subtle: rgb(21.4, 22.8, 25.6);--tblr-success-bg-subtle: rgb(9.4, 35.8, 13.6);--tblr-info-bg-subtle: rgb(13.2, 30.6, 45);--tblr-warning-bg-subtle: rgb(49, 31.8, 0);--tblr-danger-bg-subtle: rgb(42.8, 11.4, 11.4);--tblr-light-bg-subtle: #1f2937;--tblr-dark-bg-subtle: rgb(15.5, 20.5, 27.5);--tblr-primary-border-subtle: rgb(0, 79.8, 75);--tblr-secondary-border-subtle: rgb(64.2, 68.4, 76.8);--tblr-success-border-subtle: rgb(28.2, 107.4, 40.8);--tblr-info-border-subtle: rgb(39.6, 91.8, 135);--tblr-warning-border-subtle: rgb(147, 95.4, 0);--tblr-danger-border-subtle: rgb(128.4, 34.2, 34.2);--tblr-light-border-subtle: #374151;--tblr-dark-border-subtle: #1f2937;--tblr-heading-color: inherit;--tblr-link-color: rgb(102, 181.8, 177);--tblr-link-hover-color: rgb(132.6, 196.44, 192.6);--tblr-link-color-rgb: 102, 182, 177;--tblr-link-hover-color-rgb: 133, 196, 193;--tblr-code-color: var(--tblr-gray-300);--tblr-highlight-color: #e5e7eb;--tblr-highlight-bg: rgb(98, 63.6, 0);--tblr-border-color: rgb(45.7069767442, 60.4511627907, 81.0930232558);--tblr-border-color-translucent: rgba(72, 110, 149, .14);--tblr-form-valid-color: rgb(130.2, 209.4, 142.8);--tblr-form-valid-border-color: rgb(130.2, 209.4, 142.8);--tblr-form-invalid-color: rgb(230.4, 136.2, 136.2);--tblr-form-invalid-border-color: rgb(230.4, 136.2, 136.2)}*,*:before,*:after{box-sizing:border-box}@media(prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--tblr-body-font-family);font-size:var(--tblr-body-font-size);font-weight:var(--tblr-body-font-weight);line-height:var(--tblr-body-line-height);color:var(--tblr-body-color);text-align:var(--tblr-body-text-align);background-color:var(--tblr-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr,.hr{margin:2rem 0;color:inherit;border:0;border-top:var(--tblr-border-width) solid;opacity:.16}h6,.h6,h5,.h5,h4,.h4,h3,.field-group h2,.field-group .h2,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:var(--tblr-spacer);font-weight:var(--tblr-font-weight-bold);line-height:1.2;color:var(--tblr-heading-color)}h1,.h1{font-size:1.5rem}h2,.h2{font-size:1.25rem}h3,.field-group h2,.field-group .h2,.h3{font-size:1rem}h4,.h4{font-size:.875rem}h5,.h5{font-size:.75rem}h6,.h6{font-size:.625rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:600}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small,.small{font-size:.875em}mark,.mark{padding:.1875em;color:var(--tblr-highlight-color);background-color:var(--tblr-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:rgba(var(--tblr-link-color-rgb),var(--tblr-link-opacity, 1));text-decoration:none}a:hover{--tblr-link-color-rgb: var(--tblr-link-hover-color-rgb);text-decoration:underline}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:var(--tblr-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.85714285em;color:var(--tblr-light)}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.85714285em;color:var(--tblr-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.25rem .5rem;font-size:var(--tblr-font-size-h5);color:var(--tblr-text-secondary-dark);background-color:var(--tblr-code-bg);border-radius:4px}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:var(--tblr-secondary-color);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;line-height:inherit;font-size:1.5rem}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button{cursor:pointer;filter:grayscale(1)}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:.875rem;font-weight:var(--tblr-font-weight-normal)}.display-1{font-weight:300;line-height:1.2;font-size:5rem}.display-2{font-weight:300;line-height:1.2;font-size:4.5rem}.display-3{font-weight:300;line-height:1.2;font-size:4rem}.display-4{font-weight:300;line-height:1.2;font-size:3.5rem}.display-5{font-weight:300;line-height:1.2;font-size:3rem}.display-6{font-weight:300;line-height:1.2;font-size:2rem}.list-unstyled,.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:.875rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#4b5563}.blockquote-footer:before{content:"\2014\a0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:var(--tblr-body-bg);border:var(--tblr-border-width) solid var(--tblr-border-color);border-radius:var(--tblr-border-radius);box-shadow:var(--tblr-box-shadow-sm);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:var(--tblr-secondary-color)}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--tblr-gutter-x: calc(var(--tblr-page-padding) * 2);--tblr-gutter-y: 0;width:100%;padding-right:calc(var(--tblr-gutter-x) * .5);padding-left:calc(var(--tblr-gutter-x) * .5);margin-right:auto;margin-left:auto}@media(min-width:576px){.container-sm,.container{max-width:540px}}@media(min-width:768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width:992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width:1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media(min-width:1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}:root{--tblr-breakpoint-xs: 0;--tblr-breakpoint-sm: 576px;--tblr-breakpoint-md: 768px;--tblr-breakpoint-lg: 992px;--tblr-breakpoint-xl: 1200px;--tblr-breakpoint-xxl: 1400px}.row{--tblr-gutter-x: var(--tblr-page-padding);--tblr-gutter-y: 0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--tblr-gutter-y));margin-right:calc(-.5 * var(--tblr-gutter-x));margin-left:calc(-.5 * var(--tblr-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--tblr-gutter-x) * .5);padding-left:calc(var(--tblr-gutter-x) * .5);margin-top:var(--tblr-gutter-y)}.grid{display:grid;grid-template-rows:repeat(var(--tblr-rows, 1),1fr);grid-template-columns:repeat(var(--tblr-columns, 12),1fr);gap:var(--tblr-gap, var(--tblr-page-padding))}.grid .g-col-1{grid-column:auto/span 1}.grid .g-col-2{grid-column:auto/span 2}.grid .g-col-3{grid-column:auto/span 3}.grid .g-col-4{grid-column:auto/span 4}.grid .g-col-5{grid-column:auto/span 5}.grid .g-col-6{grid-column:auto/span 6}.grid .g-col-7{grid-column:auto/span 7}.grid .g-col-8{grid-column:auto/span 8}.grid .g-col-9{grid-column:auto/span 9}.grid .g-col-10{grid-column:auto/span 10}.grid .g-col-11{grid-column:auto/span 11}.grid .g-col-12{grid-column:auto/span 12}.grid .g-start-1{grid-column-start:1}.grid .g-start-2{grid-column-start:2}.grid .g-start-3{grid-column-start:3}.grid .g-start-4{grid-column-start:4}.grid .g-start-5{grid-column-start:5}.grid .g-start-6{grid-column-start:6}.grid .g-start-7{grid-column-start:7}.grid .g-start-8{grid-column-start:8}.grid .g-start-9{grid-column-start:9}.grid .g-start-10{grid-column-start:10}.grid .g-start-11{grid-column-start:11}@media(min-width:576px){.grid .g-col-sm-1{grid-column:auto/span 1}.grid .g-col-sm-2{grid-column:auto/span 2}.grid .g-col-sm-3{grid-column:auto/span 3}.grid .g-col-sm-4{grid-column:auto/span 4}.grid .g-col-sm-5{grid-column:auto/span 5}.grid .g-col-sm-6{grid-column:auto/span 6}.grid .g-col-sm-7{grid-column:auto/span 7}.grid .g-col-sm-8{grid-column:auto/span 8}.grid .g-col-sm-9{grid-column:auto/span 9}.grid .g-col-sm-10{grid-column:auto/span 10}.grid .g-col-sm-11{grid-column:auto/span 11}.grid .g-col-sm-12{grid-column:auto/span 12}.grid .g-start-sm-1{grid-column-start:1}.grid .g-start-sm-2{grid-column-start:2}.grid .g-start-sm-3{grid-column-start:3}.grid .g-start-sm-4{grid-column-start:4}.grid .g-start-sm-5{grid-column-start:5}.grid .g-start-sm-6{grid-column-start:6}.grid .g-start-sm-7{grid-column-start:7}.grid .g-start-sm-8{grid-column-start:8}.grid .g-start-sm-9{grid-column-start:9}.grid .g-start-sm-10{grid-column-start:10}.grid .g-start-sm-11{grid-column-start:11}}@media(min-width:768px){.grid .g-col-md-1{grid-column:auto/span 1}.grid .g-col-md-2{grid-column:auto/span 2}.grid .g-col-md-3{grid-column:auto/span 3}.grid .g-col-md-4{grid-column:auto/span 4}.grid .g-col-md-5{grid-column:auto/span 5}.grid .g-col-md-6{grid-column:auto/span 6}.grid .g-col-md-7{grid-column:auto/span 7}.grid .g-col-md-8{grid-column:auto/span 8}.grid .g-col-md-9{grid-column:auto/span 9}.grid .g-col-md-10{grid-column:auto/span 10}.grid .g-col-md-11{grid-column:auto/span 11}.grid .g-col-md-12{grid-column:auto/span 12}.grid .g-start-md-1{grid-column-start:1}.grid .g-start-md-2{grid-column-start:2}.grid .g-start-md-3{grid-column-start:3}.grid .g-start-md-4{grid-column-start:4}.grid .g-start-md-5{grid-column-start:5}.grid .g-start-md-6{grid-column-start:6}.grid .g-start-md-7{grid-column-start:7}.grid .g-start-md-8{grid-column-start:8}.grid .g-start-md-9{grid-column-start:9}.grid .g-start-md-10{grid-column-start:10}.grid .g-start-md-11{grid-column-start:11}}@media(min-width:992px){.grid .g-col-lg-1{grid-column:auto/span 1}.grid .g-col-lg-2{grid-column:auto/span 2}.grid .g-col-lg-3{grid-column:auto/span 3}.grid .g-col-lg-4{grid-column:auto/span 4}.grid .g-col-lg-5{grid-column:auto/span 5}.grid .g-col-lg-6{grid-column:auto/span 6}.grid .g-col-lg-7{grid-column:auto/span 7}.grid .g-col-lg-8{grid-column:auto/span 8}.grid .g-col-lg-9{grid-column:auto/span 9}.grid .g-col-lg-10{grid-column:auto/span 10}.grid .g-col-lg-11{grid-column:auto/span 11}.grid .g-col-lg-12{grid-column:auto/span 12}.grid .g-start-lg-1{grid-column-start:1}.grid .g-start-lg-2{grid-column-start:2}.grid .g-start-lg-3{grid-column-start:3}.grid .g-start-lg-4{grid-column-start:4}.grid .g-start-lg-5{grid-column-start:5}.grid .g-start-lg-6{grid-column-start:6}.grid .g-start-lg-7{grid-column-start:7}.grid .g-start-lg-8{grid-column-start:8}.grid .g-start-lg-9{grid-column-start:9}.grid .g-start-lg-10{grid-column-start:10}.grid .g-start-lg-11{grid-column-start:11}}@media(min-width:1200px){.grid .g-col-xl-1{grid-column:auto/span 1}.grid .g-col-xl-2{grid-column:auto/span 2}.grid .g-col-xl-3{grid-column:auto/span 3}.grid .g-col-xl-4{grid-column:auto/span 4}.grid .g-col-xl-5{grid-column:auto/span 5}.grid .g-col-xl-6{grid-column:auto/span 6}.grid .g-col-xl-7{grid-column:auto/span 7}.grid .g-col-xl-8{grid-column:auto/span 8}.grid .g-col-xl-9{grid-column:auto/span 9}.grid .g-col-xl-10{grid-column:auto/span 10}.grid .g-col-xl-11{grid-column:auto/span 11}.grid .g-col-xl-12{grid-column:auto/span 12}.grid .g-start-xl-1{grid-column-start:1}.grid .g-start-xl-2{grid-column-start:2}.grid .g-start-xl-3{grid-column-start:3}.grid .g-start-xl-4{grid-column-start:4}.grid .g-start-xl-5{grid-column-start:5}.grid .g-start-xl-6{grid-column-start:6}.grid .g-start-xl-7{grid-column-start:7}.grid .g-start-xl-8{grid-column-start:8}.grid .g-start-xl-9{grid-column-start:9}.grid .g-start-xl-10{grid-column-start:10}.grid .g-start-xl-11{grid-column-start:11}}@media(min-width:1400px){.grid .g-col-xxl-1{grid-column:auto/span 1}.grid .g-col-xxl-2{grid-column:auto/span 2}.grid .g-col-xxl-3{grid-column:auto/span 3}.grid .g-col-xxl-4{grid-column:auto/span 4}.grid .g-col-xxl-5{grid-column:auto/span 5}.grid .g-col-xxl-6{grid-column:auto/span 6}.grid .g-col-xxl-7{grid-column:auto/span 7}.grid .g-col-xxl-8{grid-column:auto/span 8}.grid .g-col-xxl-9{grid-column:auto/span 9}.grid .g-col-xxl-10{grid-column:auto/span 10}.grid .g-col-xxl-11{grid-column:auto/span 11}.grid .g-col-xxl-12{grid-column:auto/span 12}.grid .g-start-xxl-1{grid-column-start:1}.grid .g-start-xxl-2{grid-column-start:2}.grid .g-start-xxl-3{grid-column-start:3}.grid .g-start-xxl-4{grid-column-start:4}.grid .g-start-xxl-5{grid-column-start:5}.grid .g-start-xxl-6{grid-column-start:6}.grid .g-start-xxl-7{grid-column-start:7}.grid .g-start-xxl-8{grid-column-start:8}.grid .g-start-xxl-9{grid-column-start:9}.grid .g-start-xxl-10{grid-column-start:10}.grid .g-start-xxl-11{grid-column-start:11}}.col{flex:1 0 0}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.66666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--tblr-gutter-x: 0}.g-0,.gy-0{--tblr-gutter-y: 0}.g-1,.gx-1{--tblr-gutter-x: .25rem}.g-1,.gy-1{--tblr-gutter-y: .25rem}.g-2,.gx-2{--tblr-gutter-x: .5rem}.g-2,.gy-2{--tblr-gutter-y: .5rem}.g-3,.gx-3{--tblr-gutter-x: 1rem}.g-3,.gy-3{--tblr-gutter-y: 1rem}.g-4,.gx-4{--tblr-gutter-x: 1.5rem}.g-4,.gy-4{--tblr-gutter-y: 1.5rem}.g-5,.gx-5{--tblr-gutter-x: 2rem}.g-5,.gy-5{--tblr-gutter-y: 2rem}.g-6,.gx-6{--tblr-gutter-x: 2.5rem}.g-6,.gy-6{--tblr-gutter-y: 2.5rem}@media(min-width:576px){.col-sm{flex:1 0 0}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.66666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--tblr-gutter-x: 0}.g-sm-0,.gy-sm-0{--tblr-gutter-y: 0}.g-sm-1,.gx-sm-1{--tblr-gutter-x: .25rem}.g-sm-1,.gy-sm-1{--tblr-gutter-y: .25rem}.g-sm-2,.gx-sm-2{--tblr-gutter-x: .5rem}.g-sm-2,.gy-sm-2{--tblr-gutter-y: .5rem}.g-sm-3,.gx-sm-3{--tblr-gutter-x: 1rem}.g-sm-3,.gy-sm-3{--tblr-gutter-y: 1rem}.g-sm-4,.gx-sm-4{--tblr-gutter-x: 1.5rem}.g-sm-4,.gy-sm-4{--tblr-gutter-y: 1.5rem}.g-sm-5,.gx-sm-5{--tblr-gutter-x: 2rem}.g-sm-5,.gy-sm-5{--tblr-gutter-y: 2rem}.g-sm-6,.gx-sm-6{--tblr-gutter-x: 2.5rem}.g-sm-6,.gy-sm-6{--tblr-gutter-y: 2.5rem}}@media(min-width:768px){.col-md{flex:1 0 0}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.66666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--tblr-gutter-x: 0}.g-md-0,.gy-md-0{--tblr-gutter-y: 0}.g-md-1,.gx-md-1{--tblr-gutter-x: .25rem}.g-md-1,.gy-md-1{--tblr-gutter-y: .25rem}.g-md-2,.gx-md-2{--tblr-gutter-x: .5rem}.g-md-2,.gy-md-2{--tblr-gutter-y: .5rem}.g-md-3,.gx-md-3{--tblr-gutter-x: 1rem}.g-md-3,.gy-md-3{--tblr-gutter-y: 1rem}.g-md-4,.gx-md-4{--tblr-gutter-x: 1.5rem}.g-md-4,.gy-md-4{--tblr-gutter-y: 1.5rem}.g-md-5,.gx-md-5{--tblr-gutter-x: 2rem}.g-md-5,.gy-md-5{--tblr-gutter-y: 2rem}.g-md-6,.gx-md-6{--tblr-gutter-x: 2.5rem}.g-md-6,.gy-md-6{--tblr-gutter-y: 2.5rem}}@media(min-width:992px){.col-lg{flex:1 0 0}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.66666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--tblr-gutter-x: 0}.g-lg-0,.gy-lg-0{--tblr-gutter-y: 0}.g-lg-1,.gx-lg-1{--tblr-gutter-x: .25rem}.g-lg-1,.gy-lg-1{--tblr-gutter-y: .25rem}.g-lg-2,.gx-lg-2{--tblr-gutter-x: .5rem}.g-lg-2,.gy-lg-2{--tblr-gutter-y: .5rem}.g-lg-3,.gx-lg-3{--tblr-gutter-x: 1rem}.g-lg-3,.gy-lg-3{--tblr-gutter-y: 1rem}.g-lg-4,.gx-lg-4{--tblr-gutter-x: 1.5rem}.g-lg-4,.gy-lg-4{--tblr-gutter-y: 1.5rem}.g-lg-5,.gx-lg-5{--tblr-gutter-x: 2rem}.g-lg-5,.gy-lg-5{--tblr-gutter-y: 2rem}.g-lg-6,.gx-lg-6{--tblr-gutter-x: 2.5rem}.g-lg-6,.gy-lg-6{--tblr-gutter-y: 2.5rem}}@media(min-width:1200px){.col-xl{flex:1 0 0}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.66666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--tblr-gutter-x: 0}.g-xl-0,.gy-xl-0{--tblr-gutter-y: 0}.g-xl-1,.gx-xl-1{--tblr-gutter-x: .25rem}.g-xl-1,.gy-xl-1{--tblr-gutter-y: .25rem}.g-xl-2,.gx-xl-2{--tblr-gutter-x: .5rem}.g-xl-2,.gy-xl-2{--tblr-gutter-y: .5rem}.g-xl-3,.gx-xl-3{--tblr-gutter-x: 1rem}.g-xl-3,.gy-xl-3{--tblr-gutter-y: 1rem}.g-xl-4,.gx-xl-4{--tblr-gutter-x: 1.5rem}.g-xl-4,.gy-xl-4{--tblr-gutter-y: 1.5rem}.g-xl-5,.gx-xl-5{--tblr-gutter-x: 2rem}.g-xl-5,.gy-xl-5{--tblr-gutter-y: 2rem}.g-xl-6,.gx-xl-6{--tblr-gutter-x: 2.5rem}.g-xl-6,.gy-xl-6{--tblr-gutter-y: 2.5rem}}@media(min-width:1400px){.col-xxl{flex:1 0 0}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.66666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--tblr-gutter-x: 0}.g-xxl-0,.gy-xxl-0{--tblr-gutter-y: 0}.g-xxl-1,.gx-xxl-1{--tblr-gutter-x: .25rem}.g-xxl-1,.gy-xxl-1{--tblr-gutter-y: .25rem}.g-xxl-2,.gx-xxl-2{--tblr-gutter-x: .5rem}.g-xxl-2,.gy-xxl-2{--tblr-gutter-y: .5rem}.g-xxl-3,.gx-xxl-3{--tblr-gutter-x: 1rem}.g-xxl-3,.gy-xxl-3{--tblr-gutter-y: 1rem}.g-xxl-4,.gx-xxl-4{--tblr-gutter-x: 1.5rem}.g-xxl-4,.gy-xxl-4{--tblr-gutter-y: 1.5rem}.g-xxl-5,.gx-xxl-5{--tblr-gutter-x: 2rem}.g-xxl-5,.gy-xxl-5{--tblr-gutter-y: 2rem}.g-xxl-6,.gx-xxl-6{--tblr-gutter-x: 2.5rem}.g-xxl-6,.gy-xxl-6{--tblr-gutter-y: 2.5rem}}.table,.markdown>table{--tblr-table-color-type: initial;--tblr-table-bg-type: initial;--tblr-table-color-state: initial;--tblr-table-bg-state: initial;--tblr-table-color: inherit;--tblr-table-bg: transparent;--tblr-table-border-color: var(--tblr-border-color-translucent);--tblr-table-accent-bg: transparent;--tblr-table-striped-color: inherit;--tblr-table-striped-bg: var(--tblr-bg-surface-tertiary);--tblr-table-active-color: inherit;--tblr-table-active-bg: var(--tblr-active-bg);--tblr-table-hover-color: inherit;--tblr-table-hover-bg: rgba(var(--tblr-emphasis-color-rgb), .075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--tblr-table-border-color)}.table>:not(caption)>*>*,.markdown>table>:not(caption)>*>*{padding:.5rem;color:var(--tblr-table-color-state, var(--tblr-table-color-type, var(--tblr-table-color)));background-color:var(--tblr-table-bg);border-bottom-width:var(--tblr-border-width);box-shadow:inset 0 0 0 9999px var(--tblr-table-bg-state, var(--tblr-table-bg-type, var(--tblr-table-accent-bg)))}.table>tbody,.markdown>table>tbody{vertical-align:inherit}.table>thead,.markdown>table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(var(--tblr-border-width) * 2) solid var(--tblr-border-color-translucent)}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*,.markdown>table>:not(caption)>*>*{padding:.25rem}.table-bordered>:not(caption)>*,.markdown>table>:not(caption)>*{border-width:var(--tblr-border-width) 0}.table-bordered>:not(caption)>*>*,.markdown>table>:not(caption)>*>*{border-width:0 var(--tblr-border-width)}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(2n)>*{--tblr-table-color-type: var(--tblr-table-striped-color);--tblr-table-bg-type: var(--tblr-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(2n){--tblr-table-color-type: var(--tblr-table-striped-color);--tblr-table-bg-type: var(--tblr-table-striped-bg)}.table-active{--tblr-table-color-state: var(--tblr-table-active-color);--tblr-table-bg-state: var(--tblr-table-active-bg)}.table-hover>tbody>tr:hover>*{--tblr-table-color-state: var(--tblr-table-hover-color);--tblr-table-bg-state: var(--tblr-table-hover-bg)}.table-primary{--tblr-table-color: #1f2937;--tblr-table-bg: rgb(204, 230.6, 229);--tblr-table-border-color: rgb(169.4, 192.68, 194.2);--tblr-table-striped-bg: rgb(195.35, 221.12, 220.3);--tblr-table-striped-color: #1f2937;--tblr-table-active-bg: rgb(186.7, 211.64, 211.6);--tblr-table-active-color: #1f2937;--tblr-table-hover-bg: rgb(191.025, 216.38, 215.95);--tblr-table-hover-color: #1f2937;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-secondary{--tblr-table-color: #1f2937;--tblr-table-bg: rgb(225.4, 226.8, 229.6);--tblr-table-border-color: rgb(186.52, 189.64, 194.68);--tblr-table-striped-bg: rgb(215.68, 217.51, 220.87);--tblr-table-striped-color: #1f2937;--tblr-table-active-bg: rgb(205.96, 208.22, 212.14);--tblr-table-active-color: #1f2937;--tblr-table-hover-bg: rgb(210.82, 212.865, 216.505);--tblr-table-hover-color: #1f2937;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-success{--tblr-table-color: #1f2937;--tblr-table-bg: rgb(213.4, 239.8, 217.6);--tblr-table-border-color: rgb(176.92, 200.04, 185.08);--tblr-table-striped-bg: rgb(204.28, 229.86, 209.47);--tblr-table-striped-color: #1f2937;--tblr-table-active-bg: rgb(195.16, 219.92, 201.34);--tblr-table-active-color: #1f2937;--tblr-table-hover-bg: rgb(199.72, 224.89, 205.405);--tblr-table-hover-color: #1f2937;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-info{--tblr-table-color: #1f2937;--tblr-table-bg: rgb(217.2, 234.6, 249);--tblr-table-border-color: rgb(179.96, 195.88, 210.2);--tblr-table-striped-bg: rgb(207.89, 224.92, 239.3);--tblr-table-striped-color: #1f2937;--tblr-table-active-bg: rgb(198.58, 215.24, 229.6);--tblr-table-active-color: #1f2937;--tblr-table-hover-bg: rgb(203.235, 220.08, 234.45);--tblr-table-hover-color: #1f2937;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-warning{--tblr-table-color: #1f2937;--tblr-table-bg: rgb(253, 235.8, 204);--tblr-table-border-color: rgb(208.6, 196.84, 174.2);--tblr-table-striped-bg: rgb(241.9, 226.06, 196.55);--tblr-table-striped-color: #1f2937;--tblr-table-active-bg: rgb(230.8, 216.32, 189.1);--tblr-table-active-color: #1f2937;--tblr-table-hover-bg: rgb(236.35, 221.19, 192.825);--tblr-table-hover-color: #1f2937;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-danger{--tblr-table-color: #1f2937;--tblr-table-bg: rgb(246.8, 215.4, 215.4);--tblr-table-border-color: rgb(203.64, 180.52, 183.32);--tblr-table-striped-bg: rgb(236.01, 206.68, 207.38);--tblr-table-striped-color: #1f2937;--tblr-table-active-bg: rgb(225.22, 197.96, 199.36);--tblr-table-active-color: #f9fafb;--tblr-table-hover-bg: rgb(230.615, 202.32, 203.37);--tblr-table-hover-color: #1f2937;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-light{--tblr-table-color: #1f2937;--tblr-table-bg: #f9fafb;--tblr-table-border-color: rgb(205.4, 208.2, 211.8);--tblr-table-striped-bg: rgb(238.1, 239.55, 241.2);--tblr-table-striped-color: #1f2937;--tblr-table-active-bg: rgb(227.2, 229.1, 231.4);--tblr-table-active-color: #1f2937;--tblr-table-hover-bg: rgb(232.65, 234.325, 236.3);--tblr-table-hover-color: #1f2937;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-dark{--tblr-table-color: #f9fafb;--tblr-table-bg: #1f2937;--tblr-table-border-color: rgb(74.6, 82.8, 94.2);--tblr-table-striped-bg: rgb(41.9, 51.45, 64.8);--tblr-table-striped-color: #f9fafb;--tblr-table-active-bg: rgb(52.8, 61.9, 74.6);--tblr-table-active-color: #f9fafb;--tblr-table-hover-bg: rgb(47.35, 56.675, 69.7);--tblr-table-hover-color: #f9fafb;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media(max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem;font-size:.875rem;font-weight:var(--tblr-font-weight-medium)}.col-form-label{padding-top:calc(.5625rem + var(--tblr-border-width));padding-bottom:calc(.5625rem + var(--tblr-border-width));margin-bottom:0;font-size:inherit;font-weight:var(--tblr-font-weight-medium);line-height:1.25rem}.col-form-label-lg{padding-top:calc(.6875rem + var(--tblr-border-width));padding-bottom:calc(.6875rem + var(--tblr-border-width));font-size:1rem}.col-form-label-sm{padding-top:calc(.3125rem + var(--tblr-border-width));padding-bottom:calc(.3125rem + var(--tblr-border-width));font-size:.75rem}.form-text{margin-top:.25rem;font-size:.875em;color:var(--tblr-secondary-color)}.form-control{display:block;width:100%;padding:.5625rem 1rem;font-family:var(--tblr-body-font-family);font-size:.875rem;font-weight:400;line-height:1.25rem;color:var(--tblr-body-color);appearance:none;background-color:var(--tblr-bg-forms);background-clip:padding-box;border:var(--tblr-border-width) solid var(--tblr-border-color);border-radius:var(--tblr-border-radius);box-shadow:var(--tblr-shadow-input);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:var(--tblr-body-color);background-color:var(--tblr-bg-forms);border-color:#80c2be;outline:0;box-shadow:var(--tblr-shadow-input),0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.25rem;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::placeholder{color:var(--tblr-tertiary);opacity:1}.form-control:disabled{background-color:var(--tblr-bg-surface-secondary);opacity:1}.form-control::file-selector-button{padding:.5625rem 1rem;margin:-.5625rem -1rem;margin-inline-end:1rem;color:var(--tblr-body-color);background-color:var(--tblr-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--tblr-border-width);border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:var(--tblr-secondary-bg)}.form-control-plaintext{display:block;width:100%;padding:.5625rem 0;margin-bottom:0;line-height:1.25rem;color:var(--tblr-body-color);background-color:transparent;border:solid transparent;border-width:var(--tblr-border-width) 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.25rem + .625rem + calc(var(--tblr-border-width) * 2));padding:.3125rem .5rem;font-size:.75rem;border-radius:var(--tblr-border-radius-sm)}.form-control-sm::file-selector-button{padding:.3125rem .5rem;margin:-.3125rem -.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.25rem + 1.375rem + calc(var(--tblr-border-width) * 2));padding:.6875rem 1.5rem;font-size:1rem;border-radius:var(--tblr-border-radius-lg)}.form-control-lg::file-selector-button{padding:.6875rem 1.5rem;margin:-.6875rem -1.5rem;margin-inline-end:1.5rem}textarea.form-control{min-height:calc(1.25rem + 1.125rem + calc(var(--tblr-border-width) * 2))}textarea.form-control-sm{min-height:calc(1.25rem + .625rem + calc(var(--tblr-border-width) * 2))}textarea.form-control-lg{min-height:calc(1.25rem + 1.375rem + calc(var(--tblr-border-width) * 2))}.form-control-color{width:3rem;height:calc(1.25rem + 1.125rem + calc(var(--tblr-border-width) * 2));padding:.5625rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0!important;border-radius:var(--tblr-border-radius)}.form-control-color::-webkit-color-swatch{border:0!important;border-radius:var(--tblr-border-radius)}.form-control-color.form-control-sm{height:calc(1.25rem + .625rem + calc(var(--tblr-border-width) * 2))}.form-control-color.form-control-lg{height:calc(1.25rem + 1.375rem + calc(var(--tblr-border-width) * 2))}.form-select{--tblr-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%239ca3af' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.5625rem 3rem .5625rem 1rem;font-family:var(--tblr-body-font-family);font-size:.875rem;font-weight:400;line-height:1.25rem;color:var(--tblr-body-color);appearance:none;background-color:var(--tblr-bg-forms);background-image:var(--tblr-form-select-bg-img),var(--tblr-form-select-bg-icon, none);background-repeat:no-repeat;background-position:right 1rem center;background-size:16px 12px;border:var(--tblr-border-width) solid var(--tblr-border-color);border-radius:var(--tblr-border-radius);box-shadow:var(--tblr-shadow-input);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#80c2be;outline:0;box-shadow:var(--tblr-shadow-input),0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:1rem;background-image:none}.form-select:disabled{background-color:var(--tblr-bg-surface-secondary)}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 var(--tblr-body-color)}.form-select-sm{padding-top:.3125rem;padding-bottom:.3125rem;padding-left:.5rem;font-size:.75rem;border-radius:var(--tblr-border-radius-sm)}.form-select-lg{padding-top:.6875rem;padding-bottom:.6875rem;padding-left:1.5rem;font-size:1rem;border-radius:var(--tblr-border-radius-lg)}[data-bs-theme=dark] .form-select,body[data-bs-theme=dark] [data-bs-theme=light] .form-select{--tblr-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23e5e7eb' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check{display:block;min-height:1.25rem;padding-left:2rem;margin-bottom:.75rem}.form-check .form-check-input{float:left;margin-left:-2rem}.form-check-reverse{padding-right:2rem;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:-2rem;margin-left:0}.form-check-input{--tblr-form-check-bg: var(--tblr-bg-forms);flex-shrink:0;width:1.25rem;height:1.25rem;margin-top:.0892857143rem;vertical-align:top;appearance:none;background-color:var(--tblr-form-check-bg);background-image:var(--tblr-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent);print-color-adjust:exact}.form-check-input[type=checkbox]{border-radius:var(--tblr-border-radius)}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#80c2be;outline:0;box-shadow:0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.form-check-input:checked{background-color:var(--tblr-primary);border-color:var(--tblr-border-color-translucent)}.form-check-input:checked[type=checkbox]{--tblr-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' width='16' height='16'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8.5l2.5 2.5l5.5 -5.5'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{--tblr-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3ccircle r='3' fill='%23ffffff' cx='8' cy='8' /%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:var(--tblr-primary);border-color:var(--tblr-primary);--tblr-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input:disabled~.form-check-label{cursor:default;opacity:.7}.form-switch{padding-left:2.5rem}.form-switch .form-check-input{--tblr-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23e5e7eb'/%3e%3c/svg%3e");width:2rem;margin-left:-2.5rem;background-image:var(--tblr-form-switch-bg);background-position:left center;border-radius:2rem;transition:background-position .15s ease-in-out}.form-switch .form-check-input:focus{--tblr-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgb%28127.5, 194, 190%29'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--tblr-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23ffffff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5rem;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5rem;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.4}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--tblr-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.25rem;padding:0;appearance:none;background-color:transparent}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #f9fafb,0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #f9fafb,0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.375rem;appearance:none;background-color:var(--tblr-primary);border:2px var(--tblr-border-style) #ffffff;border-radius:1rem;box-shadow:0 .1rem .25rem #0000001a;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b3dad8}.form-range::-webkit-slider-runnable-track{width:100%;height:.25rem;color:transparent;cursor:pointer;background-color:var(--tblr-border-color);border-color:transparent;border-radius:1rem;box-shadow:var(--tblr-box-shadow-inset)}.form-range::-moz-range-thumb{width:1rem;height:1rem;appearance:none;background-color:var(--tblr-primary);border:2px var(--tblr-border-style) #ffffff;border-radius:1rem;box-shadow:0 .1rem .25rem #0000001a;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#b3dad8}.form-range::-moz-range-track{width:100%;height:.25rem;color:transparent;cursor:pointer;background-color:var(--tblr-border-color);border-color:transparent;border-radius:1rem;box-shadow:var(--tblr-box-shadow-inset)}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:var(--tblr-secondary-color)}.form-range:disabled::-moz-range-thumb{background-color:var(--tblr-secondary-color)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(var(--tblr-border-width) * 2));min-height:calc(3.5rem + calc(var(--tblr-border-width) * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;max-width:100%;height:100%;padding:1rem;overflow:hidden;color:rgba(var(--tblr-body-color-rgb),.65);text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:var(--tblr-border-width) solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media(prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem}.form-floating>.form-control::placeholder,.form-floating>.form-control-plaintext::placeholder{color:transparent}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill,.form-floating>.form-control-plaintext:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem;padding-left:1rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-control-plaintext~label,.form-floating>.form-select~label{transform:scale(.85) translateY(-.5rem) translate(.15rem)}.form-floating>.form-control:-webkit-autofill~label{transform:scale(.85) translateY(-.5rem) translate(.15rem)}.form-floating>textarea:focus~label:after,.form-floating>textarea:not(:placeholder-shown)~label:after{position:absolute;inset:1rem .5rem;z-index:-1;height:1.5em;content:"";background-color:var(--tblr-bg-forms);border-radius:var(--tblr-border-radius)}.form-floating>textarea:disabled~label:after{background-color:var(--tblr-bg-surface-secondary)}.form-floating>.form-control-plaintext~label{border-width:var(--tblr-border-width) 0}.form-floating>:disabled~label,.form-floating>.form-control:disabled~label{color:#4b5563}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select,.input-group>.form-floating{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus,.input-group>.form-floating:focus-within{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;align-items:center;padding:.5625rem 1rem;font-size:.875rem;font-weight:400;line-height:1.25rem;color:var(--tblr-gray-500);text-align:center;white-space:nowrap;background-color:var(--tblr-bg-surface-secondary);border:var(--tblr-border-width) solid var(--tblr-border-color);border-radius:var(--tblr-border-radius)}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.6875rem 1.5rem;font-size:1rem;border-radius:var(--tblr-border-radius-lg)}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.3125rem .5rem;font-size:.75rem;border-radius:var(--tblr-border-radius-sm)}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:4rem}.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(-1 * var(--tblr-border-width));border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--tblr-form-valid-color)}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:var(--tblr-spacer-1) var(--tblr-spacer-3);margin-top:.1rem;font-size:.765625rem;color:#fff;background-color:var(--tblr-success);border-radius:var(--tblr-border-radius)}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:var(--tblr-form-valid-border-color);padding-right:2.375rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%232fb344' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='20 6 9 17 4 12'%3e%3c/polyline%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right 1.53125rem center;background-size:1.8125rem 1.8125rem}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:var(--tblr-form-valid-border-color);box-shadow:var(--tblr-shadow-input),0 0 0 .25rem rgba(var(--tblr-success-rgb),.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:2.375rem;background-position:top 1.53125rem right 1.53125rem}.was-validated .form-select:valid,.form-select.is-valid{border-color:var(--tblr-form-valid-border-color)}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{--tblr-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%232fb344' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='20 6 9 17 4 12'%3e%3c/polyline%3e%3c/svg%3e");padding-right:5.5rem;background-position:right 1rem center,center right 3rem;background-size:16px 12px,1.8125rem 1.8125rem}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:var(--tblr-form-valid-border-color);box-shadow:var(--tblr-shadow-input),0 0 0 .25rem rgba(var(--tblr-success-rgb),.25)}.was-validated .form-control-color:valid,.form-control-color.is-valid{width:5.375rem}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:var(--tblr-form-valid-border-color)}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:var(--tblr-form-valid-color)}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(var(--tblr-success-rgb),.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:var(--tblr-form-valid-color)}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):valid,.input-group>.form-control:not(:focus).is-valid,.was-validated .input-group>.form-select:not(:focus):valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.input-group>.form-floating:not(:focus-within).is-valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--tblr-form-invalid-color)}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:var(--tblr-spacer-1) var(--tblr-spacer-3);margin-top:.1rem;font-size:.765625rem;color:#fff;background-color:var(--tblr-danger);border-radius:var(--tblr-border-radius)}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,select.tomselected.is-invalid+div.ts-wrapper~.invalid-feedback,.is-invalid~.invalid-tooltip,select.tomselected.is-invalid+div.ts-wrapper~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid,select.tomselected.is-invalid+div.form-control.ts-wrapper{border-color:var(--tblr-form-invalid-border-color);padding-right:2.375rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23d63939' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cline x1='18' y1='6' x2='6' y2='18'%3e%3c/line%3e%3cline x1='6' y1='6' x2='18' y2='18'%3e%3c/line%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right 1.53125rem center;background-size:1.8125rem 1.8125rem}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus,select.tomselected.is-invalid+div.form-control.ts-wrapper:focus{border-color:var(--tblr-form-invalid-border-color);box-shadow:var(--tblr-shadow-input),0 0 0 .25rem rgba(var(--tblr-danger-rgb),.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:2.375rem;background-position:top 1.53125rem right 1.53125rem}.was-validated .form-select:invalid,.form-select.is-invalid,select.tomselected.is-invalid+div.form-select.ts-wrapper{border-color:var(--tblr-form-invalid-border-color)}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),select.tomselected.is-invalid+div.form-select.ts-wrapper:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],select.tomselected.is-invalid+div.form-select.ts-wrapper:not([multiple])[size="1"]{--tblr-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23d63939' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cline x1='18' y1='6' x2='6' y2='18'%3e%3c/line%3e%3cline x1='6' y1='6' x2='18' y2='18'%3e%3c/line%3e%3c/svg%3e");padding-right:5.5rem;background-position:right 1rem center,center right 3rem;background-size:16px 12px,1.8125rem 1.8125rem}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus,select.tomselected.is-invalid+div.form-select.ts-wrapper:focus{border-color:var(--tblr-form-invalid-border-color);box-shadow:var(--tblr-shadow-input),0 0 0 .25rem rgba(var(--tblr-danger-rgb),.25)}.was-validated .form-control-color:invalid,.form-control-color.is-invalid,select.tomselected.is-invalid+div.form-control-color.ts-wrapper{width:5.375rem}.was-validated .form-check-input:invalid,.form-check-input.is-invalid,select.tomselected.is-invalid+div.form-check-input.ts-wrapper{border-color:var(--tblr-form-invalid-border-color)}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked,select.tomselected.is-invalid+div.form-check-input.ts-wrapper:checked{background-color:var(--tblr-form-invalid-color)}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus,select.tomselected.is-invalid+div.form-check-input.ts-wrapper:focus{box-shadow:0 0 0 .25rem rgba(var(--tblr-danger-rgb),.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label,select.tomselected.is-invalid+div.form-check-input.ts-wrapper~.form-check-label{color:var(--tblr-form-invalid-color)}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):invalid,.input-group>.form-control:not(:focus).is-invalid,.input-group>select.tomselected.is-invalid+div.form-control.ts-wrapper:not(:focus),.was-validated .input-group>.form-select:not(:focus):invalid,.input-group>.form-select:not(:focus).is-invalid,.input-group>select.tomselected.is-invalid+div.form-select.ts-wrapper:not(:focus),.was-validated .input-group>.form-floating:not(:focus-within):invalid,.input-group>.form-floating:not(:focus-within).is-invalid,.input-group>select.tomselected.is-invalid+div.form-floating.ts-wrapper:not(:focus-within){z-index:4}.btn{--tblr-btn-padding-x: .5rem;--tblr-btn-padding-y: .25rem;--tblr-btn-font-family: var(--tblr-body-font-family);--tblr-btn-font-size: .875rem;--tblr-btn-font-weight: var(--tblr-font-weight-medium);--tblr-btn-line-height: 1.25rem;--tblr-btn-color: var(--tblr-body-color);--tblr-btn-bg: transparent;--tblr-btn-border-width: var(--tblr-border-width);--tblr-btn-border-color: transparent;--tblr-btn-border-radius: var(--tblr-border-radius);--tblr-btn-hover-border-color: transparent;--tblr-btn-box-shadow: var(--tblr-shadow-input);--tblr-btn-disabled-opacity: .4;--tblr-btn-focus-box-shadow: 0 0 0 .25rem rgba(var(--tblr-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--tblr-btn-padding-y) var(--tblr-btn-padding-x);font-family:var(--tblr-btn-font-family);font-size:var(--tblr-btn-font-size);font-weight:var(--tblr-btn-font-weight);line-height:var(--tblr-btn-line-height);color:var(--tblr-btn-color);text-align:center;vertical-align:middle;cursor:pointer;user-select:none;border:var(--tblr-btn-border-width) solid var(--tblr-btn-border-color);border-radius:var(--tblr-btn-border-radius);background-color:var(--tblr-btn-bg);box-shadow:var(--tblr-btn-box-shadow);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:var(--tblr-btn-hover-color);text-decoration:none;background-color:var(--tblr-btn-hover-bg);border-color:var(--tblr-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--tblr-btn-color);background-color:var(--tblr-btn-bg);border-color:var(--tblr-btn-border-color)}.btn:focus-visible{color:var(--tblr-btn-hover-color);background-color:var(--tblr-btn-hover-bg);border-color:var(--tblr-btn-hover-border-color);outline:0;box-shadow:var(--tblr-btn-box-shadow),var(--tblr-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--tblr-btn-hover-border-color);outline:0;box-shadow:var(--tblr-btn-box-shadow),var(--tblr-btn-focus-box-shadow)}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--tblr-btn-active-color);background-color:var(--tblr-btn-active-bg);border-color:var(--tblr-btn-active-border-color);box-shadow:var(--tblr-btn-active-shadow)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--tblr-btn-active-shadow),var(--tblr-btn-focus-box-shadow)}.btn-check:checked:focus-visible+.btn{box-shadow:var(--tblr-btn-active-shadow),var(--tblr-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--tblr-btn-disabled-color);pointer-events:none;background-color:var(--tblr-btn-disabled-bg);border-color:var(--tblr-btn-disabled-border-color);opacity:var(--tblr-btn-disabled-opacity);box-shadow:none}.btn-link{--tblr-btn-font-weight: 400;--tblr-btn-color: var(--tblr-link-color);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-link-hover-color);--tblr-btn-hover-border-color: transparent;--tblr-btn-active-color: var(--tblr-link-hover-color);--tblr-btn-active-border-color: transparent;--tblr-btn-disabled-color: #4b5563;--tblr-btn-disabled-border-color: transparent;--tblr-btn-box-shadow: 0 0 0 #000;--tblr-btn-focus-shadow-rgb: 37, 151, 144;text-decoration:none}.btn-link:hover,.btn-link:focus-visible{text-decoration:underline}.btn-link:focus-visible{color:var(--tblr-btn-color)}.btn-link:hover{color:var(--tblr-btn-hover-color)}.btn-lg,.btn-group-lg>.btn{--tblr-btn-padding-y: .6875rem;--tblr-btn-padding-x: 1.5rem;--tblr-btn-font-size: 1rem;--tblr-btn-border-radius: var(--tblr-border-radius-lg)}.btn-sm,.btn-group-sm>.btn{--tblr-btn-padding-y: .3125rem;--tblr-btn-padding-x: .5rem;--tblr-btn-font-size: .75rem;--tblr-btn-border-radius: var(--tblr-border-radius-sm)}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media(prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle:after{content:"";display:inline-block;vertical-align:.306em;width:.36em;height:.36em;border-bottom:1px var(--tblr-border-style);border-left:1px var(--tblr-border-style);margin-right:.1em;margin-left:.4em;transform:rotate(-45deg)}.dropdown-menu{--tblr-dropdown-zindex: 1000;--tblr-dropdown-min-width: 11rem;--tblr-dropdown-padding-x: 0;--tblr-dropdown-padding-y: .25rem;--tblr-dropdown-spacer: 1px;--tblr-dropdown-font-size: .875rem;--tblr-dropdown-color: var(--tblr-body-color);--tblr-dropdown-bg: var(--tblr-bg-surface);--tblr-dropdown-border-color: var(--tblr-border-color-translucent);--tblr-dropdown-border-radius: var(--tblr-border-radius);--tblr-dropdown-border-width: var(--tblr-border-width);--tblr-dropdown-inner-border-radius: calc(var(--tblr-border-radius) - var(--tblr-border-width));--tblr-dropdown-divider-bg: var(--tblr-border-color-translucent);--tblr-dropdown-divider-margin-y: var(--tblr-spacer-2);--tblr-dropdown-box-shadow: var(--tblr-shadow-dropdown);--tblr-dropdown-link-color: inherit;--tblr-dropdown-link-hover-color: inherit;--tblr-dropdown-link-hover-bg: rgba(var(--tblr-secondary-rgb), .08);--tblr-dropdown-link-active-color: var(--tblr-primary);--tblr-dropdown-link-active-bg: var(--tblr-active-bg);--tblr-dropdown-link-disabled-color: var(--tblr-tertiary-color);--tblr-dropdown-item-padding-x: .75rem;--tblr-dropdown-item-padding-y: .5rem;--tblr-dropdown-header-color: #4b5563;--tblr-dropdown-header-padding-x: .75rem;--tblr-dropdown-header-padding-y: .25rem;position:absolute;z-index:var(--tblr-dropdown-zindex);display:none;min-width:var(--tblr-dropdown-min-width);padding:var(--tblr-dropdown-padding-y) var(--tblr-dropdown-padding-x);margin:0;font-size:var(--tblr-dropdown-font-size);color:var(--tblr-dropdown-color);text-align:left;list-style:none;background-color:var(--tblr-dropdown-bg);background-clip:padding-box;border:var(--tblr-dropdown-border-width) solid var(--tblr-dropdown-border-color);border-radius:var(--tblr-dropdown-border-radius);box-shadow:var(--tblr-dropdown-box-shadow)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--tblr-dropdown-spacer)}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media(min-width:576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media(min-width:768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media(min-width:992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media(min-width:1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media(min-width:1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--tblr-dropdown-spacer)}.dropup .dropdown-toggle:after{content:"";display:inline-block;vertical-align:.306em;width:.36em;height:.36em;border-bottom:1px var(--tblr-border-style);border-left:1px var(--tblr-border-style);margin-right:.1em;margin-left:.4em;transform:rotate(135deg)}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--tblr-dropdown-spacer)}.dropend .dropdown-toggle:after{content:"";display:inline-block;vertical-align:.306em;width:.36em;height:.36em;border-bottom:1px var(--tblr-border-style);border-left:1px var(--tblr-border-style);margin-right:.1em;margin-left:.4em;transform:rotate(-135deg)}.dropend .dropdown-toggle:after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--tblr-dropdown-spacer)}.dropstart .dropdown-toggle:after{content:"";display:inline-block;vertical-align:.306em;width:.36em;height:.36em;border-bottom:1px var(--tblr-border-style);border-left:1px var(--tblr-border-style);margin-right:.1em;margin-left:.4em;transform:rotate(45deg)}.dropstart .dropdown-toggle:before{vertical-align:0}.dropdown-divider{height:0;margin:var(--tblr-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--tblr-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--tblr-dropdown-item-padding-y) var(--tblr-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--tblr-dropdown-link-color);text-align:inherit;white-space:nowrap;background-color:transparent;border:0;border-radius:var(--tblr-dropdown-item-border-radius, 0)}.dropdown-item:hover,.dropdown-item:focus{color:var(--tblr-dropdown-link-hover-color);text-decoration:none;background-color:var(--tblr-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--tblr-dropdown-link-active-color);text-decoration:none;background-color:var(--tblr-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--tblr-dropdown-link-disabled-color);pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--tblr-dropdown-header-padding-y) var(--tblr-dropdown-header-padding-x);margin-bottom:0;font-size:.765625rem;color:var(--tblr-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--tblr-dropdown-item-padding-y) var(--tblr-dropdown-item-padding-x);color:var(--tblr-dropdown-link-color)}.dropdown-menu-dark{--tblr-dropdown-color: #d1d5db;--tblr-dropdown-bg: #1f2937;--tblr-dropdown-border-color: var(--tblr-border-color-translucent);--tblr-dropdown-box-shadow: ;--tblr-dropdown-link-color: #d1d5db;--tblr-dropdown-link-hover-color: #ffffff;--tblr-dropdown-divider-bg: var(--tblr-border-color-translucent);--tblr-dropdown-link-hover-bg: rgba(255, 255, 255, .15);--tblr-dropdown-link-active-color: var(--tblr-primary);--tblr-dropdown-link-active-bg: var(--tblr-active-bg);--tblr-dropdown-link-disabled-color: #6b7280;--tblr-dropdown-header-color: #6b7280}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:var(--tblr-border-radius)}.btn-group>:not(.btn-check:first-child)+.btn,.btn-group>.btn-group:not(:first-child){margin-left:calc(-1 * var(--tblr-border-width))}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn,.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after,.dropend .dropdown-toggle-split:after{margin-left:0}.dropstart .dropdown-toggle-split:before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:1.125rem;padding-left:1.125rem}.btn-group.show .dropdown-toggle{box-shadow:inset 0 3px 5px #00000020}.btn-group.show .dropdown-toggle.btn-link{box-shadow:none}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:calc(-1 * var(--tblr-border-width))}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:nth-child(n+3),.btn-group-vertical>:not(.btn-check)+.btn,.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--tblr-nav-link-padding-x: .75rem;--tblr-nav-link-padding-y: .5rem;--tblr-nav-link-font-weight: ;--tblr-nav-link-color: var(--tblr-gray-500);--tblr-nav-link-hover-color: var(--tblr-link-hover-color);--tblr-nav-link-disabled-color: var(--tblr-disabled-color);display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--tblr-nav-link-padding-y) var(--tblr-nav-link-padding-x);font-size:var(--tblr-nav-link-font-size);font-weight:var(--tblr-nav-link-font-weight);color:var(--tblr-nav-link-color);background:none;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.nav-link:hover,.nav-link:focus{color:var(--tblr-nav-link-hover-color);text-decoration:none}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.nav-link.disabled,.nav-link:disabled{color:var(--tblr-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--tblr-nav-tabs-border-width: var(--tblr-border-width);--tblr-nav-tabs-border-color: var(--tblr-border-color);--tblr-nav-tabs-border-radius: var(--tblr-border-radius);--tblr-nav-tabs-link-hover-border-color: var(--tblr-border-color) var(--tblr-border-color) var(--tblr-border-color);--tblr-nav-tabs-link-active-color: var(--tblr-body-color);--tblr-nav-tabs-link-active-bg: var(--tblr-body-bg);--tblr-nav-tabs-link-active-border-color: var(--tblr-border-color) var(--tblr-border-color) var(--tblr-border-color);border-bottom:var(--tblr-nav-tabs-border-width) solid var(--tblr-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1 * var(--tblr-nav-tabs-border-width));border:var(--tblr-nav-tabs-border-width) solid transparent;border-top-left-radius:var(--tblr-nav-tabs-border-radius);border-top-right-radius:var(--tblr-nav-tabs-border-radius)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--tblr-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--tblr-nav-tabs-link-active-color);background-color:var(--tblr-nav-tabs-link-active-bg);border-color:var(--tblr-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1 * var(--tblr-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--tblr-nav-pills-border-radius: var(--tblr-border-radius);--tblr-nav-pills-link-active-color: var(--tblr-primary);--tblr-nav-pills-link-active-bg: rgba(var(--tblr-secondary-rgb), .15)}.nav-pills .nav-link{border-radius:var(--tblr-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--tblr-nav-pills-link-active-color);background-color:var(--tblr-nav-pills-link-active-bg)}.nav-underline{--tblr-nav-underline-gap: 1rem;--tblr-nav-underline-border-width: .125rem;--tblr-nav-underline-link-active-color: var(--tblr-emphasis-color);gap:var(--tblr-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--tblr-nav-underline-border-width) solid transparent}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:600;color:var(--tblr-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-grow:1;flex-basis:0;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--tblr-navbar-padding-x: 0;--tblr-navbar-padding-y: .25rem;--tblr-navbar-color: var(--tblr-secondary);--tblr-navbar-hover-color: var(--tblr-body-color);--tblr-navbar-disabled-color: var(--tblr-disabled-color);--tblr-navbar-active-color: var(--tblr-body-color);--tblr-navbar-brand-padding-y: .5rem;--tblr-navbar-brand-margin-end: 1rem;--tblr-navbar-brand-font-size: 1.25rem;--tblr-navbar-brand-color: var(--tblr-body-color);--tblr-navbar-brand-hover-color: var(--tblr-body-color);--tblr-navbar-nav-link-padding-x: .75rem;--tblr-navbar-toggler-padding-y: 0;--tblr-navbar-toggler-padding-x: 0;--tblr-navbar-toggler-font-size: 1rem;--tblr-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2831, 41, 55, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--tblr-navbar-toggler-border-color: rgba(var(--tblr-emphasis-color-rgb), .15);--tblr-navbar-toggler-border-radius: var(--tblr-border-radius);--tblr-navbar-toggler-focus-width: 0;--tblr-navbar-toggler-transition: box-shadow .15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--tblr-navbar-padding-y) var(--tblr-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--tblr-navbar-brand-padding-y);padding-bottom:var(--tblr-navbar-brand-padding-y);margin-right:var(--tblr-navbar-brand-margin-end);font-size:var(--tblr-navbar-brand-font-size);color:var(--tblr-navbar-brand-color);white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--tblr-navbar-brand-hover-color);text-decoration:none}.navbar-nav{--tblr-nav-link-padding-x: 0;--tblr-nav-link-padding-y: .5rem;--tblr-nav-link-font-weight: ;--tblr-nav-link-color: var(--tblr-navbar-color);--tblr-nav-link-hover-color: var(--tblr-navbar-hover-color);--tblr-nav-link-disabled-color: var(--tblr-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--tblr-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--tblr-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--tblr-navbar-active-color)}.navbar-collapse{flex-grow:1;flex-basis:100%;align-items:center}.navbar-toggler{padding:var(--tblr-navbar-toggler-padding-y) var(--tblr-navbar-toggler-padding-x);font-size:var(--tblr-navbar-toggler-font-size);line-height:1;color:var(--tblr-navbar-color);background-color:transparent;border:var(--tblr-border-width) solid var(--tblr-navbar-toggler-border-color);border-radius:var(--tblr-navbar-toggler-border-radius);transition:var(--tblr-navbar-toggler-transition)}@media(prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--tblr-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--tblr-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--tblr-scroll-height, 75vh);overflow-y:auto}@media(min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--tblr-navbar-nav-link-padding-x);padding-left:var(--tblr-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--tblr-navbar-nav-link-padding-x);padding-left:var(--tblr-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--tblr-navbar-nav-link-padding-x);padding-left:var(--tblr-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--tblr-navbar-nav-link-padding-x);padding-left:var(--tblr-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--tblr-navbar-nav-link-padding-x);padding-left:var(--tblr-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--tblr-navbar-nav-link-padding-x);padding-left:var(--tblr-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark],body[data-bs-theme=dark] .navbar[data-bs-theme=light]{--tblr-navbar-color: rgba(255, 255, 255, .7);--tblr-navbar-hover-color: rgba(255, 255, 255, .75);--tblr-navbar-disabled-color: var(--tblr-disabled-color);--tblr-navbar-active-color: #ffffff;--tblr-navbar-brand-color: #ffffff;--tblr-navbar-brand-hover-color: #ffffff;--tblr-navbar-toggler-border-color: rgba(255, 255, 255, .1);--tblr-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.7%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon,body[data-bs-theme=dark] [data-bs-theme=light] .navbar-toggler-icon{--tblr-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.7%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--tblr-card-spacer-y: 1rem;--tblr-card-spacer-x: 1.25rem;--tblr-card-title-spacer-y: 1.25rem;--tblr-card-title-color: ;--tblr-card-subtitle-color: ;--tblr-card-border-width: var(--tblr-border-width);--tblr-card-border-color: var(--tblr-border-color-translucent);--tblr-card-border-radius: var(--tblr-border-radius-lg);--tblr-card-box-shadow: var(--tblr-shadow-card);--tblr-card-inner-border-radius: calc(var(--tblr-border-radius-lg) - (var(--tblr-border-width)));--tblr-card-cap-padding-y: 1rem;--tblr-card-cap-padding-x: 1.25rem;--tblr-card-cap-bg: var(--tblr-bg-surface-tertiary);--tblr-card-cap-color: inherit;--tblr-card-height: ;--tblr-card-color: inherit;--tblr-card-bg: var(--tblr-bg-surface);--tblr-card-img-overlay-padding: 1rem;--tblr-card-group-margin: 1.5rem;position:relative;display:flex;flex-direction:column;min-width:0;height:var(--tblr-card-height);color:var(--tblr-body-color);word-wrap:break-word;background-color:var(--tblr-card-bg);background-clip:border-box;border:var(--tblr-card-border-width) solid var(--tblr-card-border-color);border-radius:var(--tblr-card-border-radius);box-shadow:var(--tblr-card-box-shadow)}.card>hr,.card>.hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--tblr-card-inner-border-radius);border-top-right-radius:var(--tblr-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--tblr-card-inner-border-radius);border-bottom-left-radius:var(--tblr-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:var(--tblr-card-spacer-y) var(--tblr-card-spacer-x);color:var(--tblr-card-color)}.card-title{margin-bottom:var(--tblr-card-title-spacer-y);color:var(--tblr-card-title-color)}.card-subtitle{margin-top:calc(-.5 * var(--tblr-card-title-spacer-y));margin-bottom:0;color:var(--tblr-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:var(--tblr-card-spacer-x)}.card-header{padding:var(--tblr-card-cap-padding-y) var(--tblr-card-cap-padding-x);margin-bottom:0;color:var(--tblr-card-cap-color);background-color:var(--tblr-card-cap-bg);border-bottom:var(--tblr-card-border-width) solid var(--tblr-card-border-color)}.card-header:first-child{border-radius:var(--tblr-card-inner-border-radius) var(--tblr-card-inner-border-radius) 0 0}.card-footer{padding:var(--tblr-card-cap-padding-y) var(--tblr-card-cap-padding-x);color:var(--tblr-card-cap-color);background-color:var(--tblr-card-cap-bg);border-top:var(--tblr-card-border-width) solid var(--tblr-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--tblr-card-inner-border-radius) var(--tblr-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-.5 * var(--tblr-card-cap-padding-x));margin-bottom:calc(-1 * var(--tblr-card-cap-padding-y));margin-left:calc(-.5 * var(--tblr-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--tblr-card-bg);border-bottom-color:var(--tblr-card-bg)}.card-header-pills{margin-right:calc(-.5 * var(--tblr-card-cap-padding-x));margin-left:calc(-.5 * var(--tblr-card-cap-padding-x))}.card-img-overlay{position:absolute;inset:0;padding:var(--tblr-card-img-overlay-padding);border-radius:var(--tblr-card-inner-border-radius)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--tblr-card-inner-border-radius);border-top-right-radius:var(--tblr-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--tblr-card-inner-border-radius);border-bottom-left-radius:var(--tblr-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--tblr-card-group-margin)}@media(min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child)>.card-img-top,.card-group>.card:not(:last-child)>.card-header{border-top-right-radius:0}.card-group>.card:not(:last-child)>.card-img-bottom,.card-group>.card:not(:last-child)>.card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child)>.card-img-top,.card-group>.card:not(:first-child)>.card-header{border-top-left-radius:0}.card-group>.card:not(:first-child)>.card-img-bottom,.card-group>.card:not(:first-child)>.card-footer{border-bottom-left-radius:0}}.pagination{--tblr-pagination-padding-x: .25rem;--tblr-pagination-padding-y: calc(.25rem + 1px) ;--tblr-pagination-font-size: .875rem;--tblr-pagination-color: var(--tblr-body-color);--tblr-pagination-bg: transparent;--tblr-pagination-border-width: 1px;--tblr-pagination-border-color: transparent;--tblr-pagination-border-radius: var(--tblr-border-radius);--tblr-pagination-hover-color: var(--tblr-link-hover-color);--tblr-pagination-hover-bg: var(--tblr-active-bg);--tblr-pagination-hover-border-color: var(--tblr-pagination-border-color);--tblr-pagination-focus-color: var(--tblr-link-hover-color);--tblr-pagination-focus-bg: var(--tblr-secondary-bg);--tblr-pagination-focus-box-shadow: 0 0 0 .25rem rgba(var(--tblr-primary-rgb), .25);--tblr-pagination-active-color: #ffffff;--tblr-pagination-active-bg: var(--tblr-primary);--tblr-pagination-active-border-color: var(--tblr-primary);--tblr-pagination-disabled-color: var(--tblr-disabled-color);--tblr-pagination-disabled-bg: transparent;--tblr-pagination-disabled-border-color: var(--tblr-pagination-border-color);display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--tblr-pagination-padding-y) var(--tblr-pagination-padding-x);font-size:var(--tblr-pagination-font-size);color:var(--tblr-pagination-color);background-color:var(--tblr-pagination-bg);border:var(--tblr-pagination-border-width) solid var(--tblr-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--tblr-pagination-hover-color);text-decoration:none;background-color:var(--tblr-pagination-hover-bg);border-color:var(--tblr-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--tblr-pagination-focus-color);background-color:var(--tblr-pagination-focus-bg);outline:0;box-shadow:var(--tblr-pagination-focus-box-shadow)}.page-link.active,.active>.page-link{z-index:3;color:var(--tblr-pagination-active-color);background-color:var(--tblr-pagination-active-bg);border-color:var(--tblr-pagination-active-border-color)}.page-link.disabled,.disabled>.page-link{color:var(--tblr-pagination-disabled-color);pointer-events:none;background-color:var(--tblr-pagination-disabled-bg);border-color:var(--tblr-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item:first-child .page-link{border-top-left-radius:var(--tblr-pagination-border-radius);border-bottom-left-radius:var(--tblr-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--tblr-pagination-border-radius);border-bottom-right-radius:var(--tblr-pagination-border-radius)}.pagination-lg{--tblr-pagination-padding-x: 1.5rem;--tblr-pagination-padding-y: .75rem;--tblr-pagination-font-size: 1.09375rem;--tblr-pagination-border-radius: var(--tblr-border-radius-lg)}.pagination-sm{--tblr-pagination-padding-x: .5rem;--tblr-pagination-padding-y: .25rem;--tblr-pagination-font-size: .765625rem;--tblr-pagination-border-radius: var(--tblr-border-radius-sm)}@keyframes progress-bar-stripes{0%{background-position-x:var(--tblr-progress-height)}}.progress,.progress-stacked{--tblr-progress-height: .5rem;--tblr-progress-font-size: .65625rem;--tblr-progress-bg: var(--tblr-border-color);--tblr-progress-border-radius: var(--tblr-border-radius);--tblr-progress-box-shadow: var(--tblr-box-shadow-inset);--tblr-progress-bar-color: #ffffff;--tblr-progress-bar-bg: var(--tblr-primary);--tblr-progress-bar-transition: width .6s ease;display:flex;height:var(--tblr-progress-height);overflow:hidden;font-size:var(--tblr-progress-font-size);background-color:var(--tblr-progress-bg);border-radius:var(--tblr-progress-border-radius);box-shadow:var(--tblr-progress-box-shadow)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:var(--tblr-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--tblr-progress-bar-bg);transition:var(--tblr-progress-bar-transition)}@media(prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:var(--tblr-progress-height) var(--tblr-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.list-group{--tblr-list-group-color: var(--tblr-body-color);--tblr-list-group-bg: inherit;--tblr-list-group-border-color: var(--tblr-border-color);--tblr-list-group-border-width: var(--tblr-border-width);--tblr-list-group-border-radius: var(--tblr-border-radius);--tblr-list-group-item-padding-x: 1.25rem;--tblr-list-group-item-padding-y: 1rem;--tblr-list-group-action-color: inherit;--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: rgba(var(--tblr-secondary-rgb), .08);--tblr-list-group-action-active-color: var(--tblr-body-color);--tblr-list-group-action-active-bg: var(--tblr-secondary-bg);--tblr-list-group-disabled-color: var(--tblr-secondary-color);--tblr-list-group-disabled-bg: inherit;--tblr-list-group-active-color: inherit;--tblr-list-group-active-bg: var(--tblr-active-bg);--tblr-list-group-active-border-color: var(--tblr-border-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--tblr-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item:before{content:counters(section,".") ". ";counter-increment:section}.list-group-item{position:relative;display:block;padding:var(--tblr-list-group-item-padding-y) var(--tblr-list-group-item-padding-x);color:var(--tblr-list-group-color);background-color:var(--tblr-list-group-bg);border:var(--tblr-list-group-border-width) solid var(--tblr-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--tblr-list-group-disabled-color);pointer-events:none;background-color:var(--tblr-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--tblr-list-group-active-color);background-color:var(--tblr-list-group-active-bg);border-color:var(--tblr-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1 * var(--tblr-list-group-border-width));border-top-width:var(--tblr-list-group-border-width)}.list-group-item-action{width:100%;color:var(--tblr-list-group-action-color);text-align:inherit}.list-group-item-action:not(.active):hover,.list-group-item-action:not(.active):focus{z-index:1;color:var(--tblr-list-group-action-hover-color);text-decoration:none;background-color:var(--tblr-list-group-action-hover-bg)}.list-group-item-action:not(.active):active{color:var(--tblr-list-group-action-active-color);background-color:var(--tblr-list-group-action-active-bg)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--tblr-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--tblr-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--tblr-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--tblr-list-group-border-width));border-left-width:var(--tblr-list-group-border-width)}@media(min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--tblr-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--tblr-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--tblr-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--tblr-list-group-border-width));border-left-width:var(--tblr-list-group-border-width)}}@media(min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--tblr-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--tblr-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--tblr-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--tblr-list-group-border-width));border-left-width:var(--tblr-list-group-border-width)}}@media(min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--tblr-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--tblr-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--tblr-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--tblr-list-group-border-width));border-left-width:var(--tblr-list-group-border-width)}}@media(min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--tblr-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--tblr-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--tblr-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--tblr-list-group-border-width));border-left-width:var(--tblr-list-group-border-width)}}@media(min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--tblr-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--tblr-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--tblr-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--tblr-list-group-border-width));border-left-width:var(--tblr-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--tblr-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{--tblr-list-group-color: var(--tblr-primary-text-emphasis);--tblr-list-group-bg: var(--tblr-primary-bg-subtle);--tblr-list-group-border-color: var(--tblr-primary-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-primary-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-primary-border-subtle);--tblr-list-group-active-color: var(--tblr-primary-bg-subtle);--tblr-list-group-active-bg: var(--tblr-primary-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-primary-text-emphasis)}.list-group-item-secondary{--tblr-list-group-color: var(--tblr-secondary-text-emphasis);--tblr-list-group-bg: var(--tblr-secondary-bg-subtle);--tblr-list-group-border-color: var(--tblr-secondary-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-secondary-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-secondary-border-subtle);--tblr-list-group-active-color: var(--tblr-secondary-bg-subtle);--tblr-list-group-active-bg: var(--tblr-secondary-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-secondary-text-emphasis)}.list-group-item-success{--tblr-list-group-color: var(--tblr-success-text-emphasis);--tblr-list-group-bg: var(--tblr-success-bg-subtle);--tblr-list-group-border-color: var(--tblr-success-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-success-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-success-border-subtle);--tblr-list-group-active-color: var(--tblr-success-bg-subtle);--tblr-list-group-active-bg: var(--tblr-success-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-success-text-emphasis)}.list-group-item-info{--tblr-list-group-color: var(--tblr-info-text-emphasis);--tblr-list-group-bg: var(--tblr-info-bg-subtle);--tblr-list-group-border-color: var(--tblr-info-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-info-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-info-border-subtle);--tblr-list-group-active-color: var(--tblr-info-bg-subtle);--tblr-list-group-active-bg: var(--tblr-info-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-info-text-emphasis)}.list-group-item-warning{--tblr-list-group-color: var(--tblr-warning-text-emphasis);--tblr-list-group-bg: var(--tblr-warning-bg-subtle);--tblr-list-group-border-color: var(--tblr-warning-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-warning-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-warning-border-subtle);--tblr-list-group-active-color: var(--tblr-warning-bg-subtle);--tblr-list-group-active-bg: var(--tblr-warning-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-warning-text-emphasis)}.list-group-item-danger{--tblr-list-group-color: var(--tblr-danger-text-emphasis);--tblr-list-group-bg: var(--tblr-danger-bg-subtle);--tblr-list-group-border-color: var(--tblr-danger-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-danger-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-danger-border-subtle);--tblr-list-group-active-color: var(--tblr-danger-bg-subtle);--tblr-list-group-active-bg: var(--tblr-danger-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-danger-text-emphasis)}.list-group-item-light{--tblr-list-group-color: var(--tblr-light-text-emphasis);--tblr-list-group-bg: var(--tblr-light-bg-subtle);--tblr-list-group-border-color: var(--tblr-light-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-light-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-light-border-subtle);--tblr-list-group-active-color: var(--tblr-light-bg-subtle);--tblr-list-group-active-bg: var(--tblr-light-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-light-text-emphasis)}.list-group-item-dark{--tblr-list-group-color: var(--tblr-dark-text-emphasis);--tblr-list-group-bg: var(--tblr-dark-bg-subtle);--tblr-list-group-border-color: var(--tblr-dark-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-dark-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-dark-border-subtle);--tblr-list-group-active-color: var(--tblr-dark-bg-subtle);--tblr-list-group-active-bg: var(--tblr-dark-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-dark-text-emphasis)}.list-group-item-muted{--tblr-list-group-color: var(--tblr-muted-text-emphasis);--tblr-list-group-bg: var(--tblr-muted-bg-subtle);--tblr-list-group-border-color: var(--tblr-muted-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-muted-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-muted-border-subtle);--tblr-list-group-active-color: var(--tblr-muted-bg-subtle);--tblr-list-group-active-bg: var(--tblr-muted-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-muted-text-emphasis)}.list-group-item-blue{--tblr-list-group-color: var(--tblr-blue-text-emphasis);--tblr-list-group-bg: var(--tblr-blue-bg-subtle);--tblr-list-group-border-color: var(--tblr-blue-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-blue-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-blue-border-subtle);--tblr-list-group-active-color: var(--tblr-blue-bg-subtle);--tblr-list-group-active-bg: var(--tblr-blue-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-blue-text-emphasis)}.list-group-item-azure{--tblr-list-group-color: var(--tblr-azure-text-emphasis);--tblr-list-group-bg: var(--tblr-azure-bg-subtle);--tblr-list-group-border-color: var(--tblr-azure-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-azure-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-azure-border-subtle);--tblr-list-group-active-color: var(--tblr-azure-bg-subtle);--tblr-list-group-active-bg: var(--tblr-azure-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-azure-text-emphasis)}.list-group-item-indigo{--tblr-list-group-color: var(--tblr-indigo-text-emphasis);--tblr-list-group-bg: var(--tblr-indigo-bg-subtle);--tblr-list-group-border-color: var(--tblr-indigo-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-indigo-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-indigo-border-subtle);--tblr-list-group-active-color: var(--tblr-indigo-bg-subtle);--tblr-list-group-active-bg: var(--tblr-indigo-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-indigo-text-emphasis)}.list-group-item-purple{--tblr-list-group-color: var(--tblr-purple-text-emphasis);--tblr-list-group-bg: var(--tblr-purple-bg-subtle);--tblr-list-group-border-color: var(--tblr-purple-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-purple-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-purple-border-subtle);--tblr-list-group-active-color: var(--tblr-purple-bg-subtle);--tblr-list-group-active-bg: var(--tblr-purple-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-purple-text-emphasis)}.list-group-item-pink{--tblr-list-group-color: var(--tblr-pink-text-emphasis);--tblr-list-group-bg: var(--tblr-pink-bg-subtle);--tblr-list-group-border-color: var(--tblr-pink-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-pink-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-pink-border-subtle);--tblr-list-group-active-color: var(--tblr-pink-bg-subtle);--tblr-list-group-active-bg: var(--tblr-pink-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-pink-text-emphasis)}.list-group-item-red{--tblr-list-group-color: var(--tblr-red-text-emphasis);--tblr-list-group-bg: var(--tblr-red-bg-subtle);--tblr-list-group-border-color: var(--tblr-red-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-red-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-red-border-subtle);--tblr-list-group-active-color: var(--tblr-red-bg-subtle);--tblr-list-group-active-bg: var(--tblr-red-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-red-text-emphasis)}.list-group-item-orange{--tblr-list-group-color: var(--tblr-orange-text-emphasis);--tblr-list-group-bg: var(--tblr-orange-bg-subtle);--tblr-list-group-border-color: var(--tblr-orange-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-orange-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-orange-border-subtle);--tblr-list-group-active-color: var(--tblr-orange-bg-subtle);--tblr-list-group-active-bg: var(--tblr-orange-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-orange-text-emphasis)}.list-group-item-yellow{--tblr-list-group-color: var(--tblr-yellow-text-emphasis);--tblr-list-group-bg: var(--tblr-yellow-bg-subtle);--tblr-list-group-border-color: var(--tblr-yellow-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-yellow-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-yellow-border-subtle);--tblr-list-group-active-color: var(--tblr-yellow-bg-subtle);--tblr-list-group-active-bg: var(--tblr-yellow-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-yellow-text-emphasis)}.list-group-item-lime{--tblr-list-group-color: var(--tblr-lime-text-emphasis);--tblr-list-group-bg: var(--tblr-lime-bg-subtle);--tblr-list-group-border-color: var(--tblr-lime-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-lime-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-lime-border-subtle);--tblr-list-group-active-color: var(--tblr-lime-bg-subtle);--tblr-list-group-active-bg: var(--tblr-lime-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-lime-text-emphasis)}.list-group-item-green{--tblr-list-group-color: var(--tblr-green-text-emphasis);--tblr-list-group-bg: var(--tblr-green-bg-subtle);--tblr-list-group-border-color: var(--tblr-green-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-green-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-green-border-subtle);--tblr-list-group-active-color: var(--tblr-green-bg-subtle);--tblr-list-group-active-bg: var(--tblr-green-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-green-text-emphasis)}.list-group-item-teal{--tblr-list-group-color: var(--tblr-teal-text-emphasis);--tblr-list-group-bg: var(--tblr-teal-bg-subtle);--tblr-list-group-border-color: var(--tblr-teal-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-teal-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-teal-border-subtle);--tblr-list-group-active-color: var(--tblr-teal-bg-subtle);--tblr-list-group-active-bg: var(--tblr-teal-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-teal-text-emphasis)}.list-group-item-cyan{--tblr-list-group-color: var(--tblr-cyan-text-emphasis);--tblr-list-group-bg: var(--tblr-cyan-bg-subtle);--tblr-list-group-border-color: var(--tblr-cyan-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-cyan-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-cyan-border-subtle);--tblr-list-group-active-color: var(--tblr-cyan-bg-subtle);--tblr-list-group-active-bg: var(--tblr-cyan-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-cyan-text-emphasis)}.toast{--tblr-toast-zindex: 1090;--tblr-toast-padding-x: .75rem;--tblr-toast-padding-y: .5rem;--tblr-toast-spacing: calc(var(--tblr-page-padding) * 2);--tblr-toast-max-width: 350px;--tblr-toast-font-size: .875rem;--tblr-toast-color: ;--tblr-toast-bg: var(--tblr-bg-surface);--tblr-toast-border-width: var(--tblr-border-width);--tblr-toast-border-color: var(--tblr-border-color);--tblr-toast-border-radius: var(--tblr-border-radius);--tblr-toast-box-shadow: var(--tblr-box-shadow);--tblr-toast-header-color: var(--tblr-gray-500);--tblr-toast-header-bg: rgba(var(--tblr-body-bg-rgb), .85);--tblr-toast-header-border-color: var(--tblr-border-color);width:var(--tblr-toast-max-width);max-width:100%;font-size:var(--tblr-toast-font-size);color:var(--tblr-toast-color);pointer-events:auto;background-color:var(--tblr-toast-bg);background-clip:padding-box;border:var(--tblr-toast-border-width) solid var(--tblr-toast-border-color);box-shadow:var(--tblr-toast-box-shadow);border-radius:var(--tblr-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--tblr-toast-zindex: 1090;position:absolute;z-index:var(--tblr-toast-zindex);width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--tblr-toast-spacing)}.toast-header{display:flex;align-items:center;padding:var(--tblr-toast-padding-y) var(--tblr-toast-padding-x);color:var(--tblr-toast-header-color);background-color:var(--tblr-toast-header-bg);background-clip:padding-box;border-bottom:var(--tblr-toast-border-width) solid var(--tblr-toast-header-border-color);border-top-left-radius:calc(var(--tblr-toast-border-radius) - var(--tblr-toast-border-width));border-top-right-radius:calc(var(--tblr-toast-border-radius) - var(--tblr-toast-border-width))}.toast-header .btn-close{margin-right:calc(-.5 * var(--tblr-toast-padding-x));margin-left:var(--tblr-toast-padding-x)}.toast-body{padding:var(--tblr-toast-padding-x);word-wrap:break-word}.modal{--tblr-modal-zindex: 1055;--tblr-modal-width: 540px;--tblr-modal-padding: 1.5rem;--tblr-modal-margin: .5rem;--tblr-modal-color: var(--tblr-body-color);--tblr-modal-bg: var(--tblr-bg-surface);--tblr-modal-border-color: transparent;--tblr-modal-border-width: var(--tblr-border-width);--tblr-modal-border-radius: var(--tblr-border-radius-lg);--tblr-modal-box-shadow: var(--tblr-box-shadow-sm);--tblr-modal-inner-border-radius: calc(var(--tblr-modal-border-radius) - 1px);--tblr-modal-header-padding-x: 1.5rem;--tblr-modal-header-padding-y: 1.5rem;--tblr-modal-header-padding: 1.5rem;--tblr-modal-header-border-color: var(--tblr-border-color);--tblr-modal-header-border-width: var(--tblr-border-width);--tblr-modal-title-line-height: 1.4285714286;--tblr-modal-footer-gap: .75rem;--tblr-modal-footer-bg: var(--tblr-bg-surface-tertiary);--tblr-modal-footer-border-color: var(--tblr-border-color);--tblr-modal-footer-border-width: var(--tblr-border-width);position:fixed;top:0;left:0;z-index:var(--tblr-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--tblr-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transform:translateY(-1rem);transition:transform .3s ease-out}@media(prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--tblr-modal-margin) * 2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - var(--tblr-modal-margin) * 2)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;color:var(--tblr-modal-color);pointer-events:auto;background-color:var(--tblr-modal-bg);background-clip:padding-box;border:var(--tblr-modal-border-width) solid var(--tblr-modal-border-color);border-radius:var(--tblr-modal-border-radius);box-shadow:var(--tblr-modal-box-shadow);outline:0}.modal-backdrop{--tblr-backdrop-zindex: 1050;--tblr-backdrop-bg: var(--tblr-gray-800);--tblr-backdrop-opacity: .24;position:fixed;top:0;left:0;z-index:var(--tblr-backdrop-zindex);width:100vw;height:100vh;background-color:var(--tblr-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--tblr-backdrop-opacity)}.modal-header{display:flex;flex-shrink:0;align-items:center;padding:var(--tblr-modal-header-padding);border-bottom:var(--tblr-modal-header-border-width) solid var(--tblr-modal-header-border-color);border-top-left-radius:var(--tblr-modal-inner-border-radius);border-top-right-radius:var(--tblr-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--tblr-modal-header-padding-y) * .5) calc(var(--tblr-modal-header-padding-x) * .5);margin-top:calc(-.5 * var(--tblr-modal-header-padding-y));margin-right:calc(-.5 * var(--tblr-modal-header-padding-x));margin-bottom:calc(-.5 * var(--tblr-modal-header-padding-y));margin-left:auto}.modal-title{margin-bottom:0;line-height:var(--tblr-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;padding:var(--tblr-modal-padding)}.modal-footer{display:flex;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:calc(var(--tblr-modal-padding) - var(--tblr-modal-footer-gap) * .5);background-color:var(--tblr-modal-footer-bg);border-top:var(--tblr-modal-footer-border-width) solid var(--tblr-modal-footer-border-color);border-bottom-right-radius:var(--tblr-modal-inner-border-radius);border-bottom-left-radius:var(--tblr-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--tblr-modal-footer-gap) * .5)}@media(min-width:576px){.modal{--tblr-modal-margin: 1.75rem;--tblr-modal-box-shadow: var(--tblr-box-shadow)}.modal-dialog{max-width:var(--tblr-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--tblr-modal-width: 380px}}@media(min-width:992px){.modal-lg,.modal-xl{--tblr-modal-width: 720px}}@media(min-width:1200px){.modal-xl{--tblr-modal-width: 1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header,.modal-fullscreen .modal-footer{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media(max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header,.modal-fullscreen-sm-down .modal-footer{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media(max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header,.modal-fullscreen-md-down .modal-footer{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media(max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header,.modal-fullscreen-lg-down .modal-footer{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media(max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header,.modal-fullscreen-xl-down .modal-footer{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media(max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header,.modal-fullscreen-xxl-down .modal-footer{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--tblr-tooltip-zindex: 1080;--tblr-tooltip-max-width: 200px;--tblr-tooltip-padding-x: var(--tblr-spacer-3);--tblr-tooltip-padding-y: var(--tblr-spacer-1);--tblr-tooltip-margin: ;--tblr-tooltip-font-size: .765625rem;--tblr-tooltip-color: var(--tblr-text-inverted);--tblr-tooltip-bg: var(--tblr-bg-surface-inverted);--tblr-tooltip-border-radius: var(--tblr-border-radius);--tblr-tooltip-opacity: .9;--tblr-tooltip-arrow-width: .8rem;--tblr-tooltip-arrow-height: .4rem;z-index:var(--tblr-tooltip-zindex);display:block;margin:var(--tblr-tooltip-margin);font-family:var(--tblr-font-sans-serif);font-style:normal;font-weight:400;line-height:1.4285714286;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--tblr-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--tblr-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--tblr-tooltip-arrow-width);height:var(--tblr-tooltip-arrow-height)}.tooltip .tooltip-arrow:before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:calc(-1 * var(--tblr-tooltip-arrow-height))}.bs-tooltip-top .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow:before{top:-1px;border-width:var(--tblr-tooltip-arrow-height) calc(var(--tblr-tooltip-arrow-width) * .5) 0;border-top-color:var(--tblr-tooltip-bg)}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:calc(-1 * var(--tblr-tooltip-arrow-height));width:var(--tblr-tooltip-arrow-height);height:var(--tblr-tooltip-arrow-width)}.bs-tooltip-end .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow:before{right:-1px;border-width:calc(var(--tblr-tooltip-arrow-width) * .5) var(--tblr-tooltip-arrow-height) calc(var(--tblr-tooltip-arrow-width) * .5) 0;border-right-color:var(--tblr-tooltip-bg)}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:calc(-1 * var(--tblr-tooltip-arrow-height))}.bs-tooltip-bottom .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow:before{bottom:-1px;border-width:0 calc(var(--tblr-tooltip-arrow-width) * .5) var(--tblr-tooltip-arrow-height);border-bottom-color:var(--tblr-tooltip-bg)}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:calc(-1 * var(--tblr-tooltip-arrow-height));width:var(--tblr-tooltip-arrow-height);height:var(--tblr-tooltip-arrow-width)}.bs-tooltip-start .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow:before{left:-1px;border-width:calc(var(--tblr-tooltip-arrow-width) * .5) 0 calc(var(--tblr-tooltip-arrow-width) * .5) var(--tblr-tooltip-arrow-height);border-left-color:var(--tblr-tooltip-bg)}.tooltip-inner{max-width:var(--tblr-tooltip-max-width);padding:var(--tblr-tooltip-padding-y) var(--tblr-tooltip-padding-x);color:var(--tblr-tooltip-color);text-align:center;background-color:var(--tblr-tooltip-bg);border-radius:var(--tblr-tooltip-border-radius)}.popover{--tblr-popover-zindex: 1070;--tblr-popover-max-width: 276px;--tblr-popover-font-size: .765625rem;--tblr-popover-bg: var(--tblr-bg-surface);--tblr-popover-border-width: var(--tblr-border-width);--tblr-popover-border-color: var(--tblr-border-color);--tblr-popover-border-radius: var(--tblr-border-radius-lg);--tblr-popover-inner-border-radius: calc(var(--tblr-border-radius-lg) - var(--tblr-border-width));--tblr-popover-box-shadow: var(--tblr-shadow-lg);--tblr-popover-header-padding-x: 1rem;--tblr-popover-header-padding-y: .5rem;--tblr-popover-header-font-size: .875rem;--tblr-popover-header-color: inherit;--tblr-popover-header-bg: transparent;--tblr-popover-body-padding-x: .5rem;--tblr-popover-body-padding-y: .5rem;--tblr-popover-body-color: inherit;--tblr-popover-arrow-width: 1rem;--tblr-popover-arrow-height: .5rem;--tblr-popover-arrow-border: var(--tblr-popover-border-color);z-index:var(--tblr-popover-zindex);display:block;max-width:var(--tblr-popover-max-width);font-family:var(--tblr-font-sans-serif);font-style:normal;font-weight:400;line-height:1.4285714286;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--tblr-popover-font-size);word-wrap:break-word;background-color:var(--tblr-popover-bg);background-clip:padding-box;border:var(--tblr-popover-border-width) solid var(--tblr-popover-border-color);border-radius:var(--tblr-popover-border-radius);box-shadow:var(--tblr-popover-box-shadow)}.popover .popover-arrow{display:block;width:var(--tblr-popover-arrow-width);height:var(--tblr-popover-arrow-height)}.popover .popover-arrow:before,.popover .popover-arrow:after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid;border-width:0}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-1 * (var(--tblr-popover-arrow-height)) - var(--tblr-popover-border-width))}.bs-popover-top>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:before,.bs-popover-top>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:after{border-width:var(--tblr-popover-arrow-height) calc(var(--tblr-popover-arrow-width) * .5) 0}.bs-popover-top>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:before{bottom:0;border-top-color:var(--tblr-popover-arrow-border)}.bs-popover-top>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:after{bottom:var(--tblr-popover-border-width);border-top-color:var(--tblr-popover-bg)}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-1 * (var(--tblr-popover-arrow-height)) - var(--tblr-popover-border-width));width:var(--tblr-popover-arrow-height);height:var(--tblr-popover-arrow-width)}.bs-popover-end>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:before,.bs-popover-end>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:after{border-width:calc(var(--tblr-popover-arrow-width) * .5) var(--tblr-popover-arrow-height) calc(var(--tblr-popover-arrow-width) * .5) 0}.bs-popover-end>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:before{left:0;border-right-color:var(--tblr-popover-arrow-border)}.bs-popover-end>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:after{left:var(--tblr-popover-border-width);border-right-color:var(--tblr-popover-bg)}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-1 * (var(--tblr-popover-arrow-height)) - var(--tblr-popover-border-width))}.bs-popover-bottom>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:before,.bs-popover-bottom>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:after{border-width:0 calc(var(--tblr-popover-arrow-width) * .5) var(--tblr-popover-arrow-height)}.bs-popover-bottom>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:before{top:0;border-bottom-color:var(--tblr-popover-arrow-border)}.bs-popover-bottom>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:after{top:var(--tblr-popover-border-width);border-bottom-color:var(--tblr-popover-bg)}.bs-popover-bottom .popover-header:before,.bs-popover-auto[data-popper-placement^=bottom] .popover-header:before{position:absolute;top:0;left:50%;display:block;width:var(--tblr-popover-arrow-width);margin-left:calc(-.5 * var(--tblr-popover-arrow-width));content:"";border-bottom:var(--tblr-popover-border-width) solid var(--tblr-popover-header-bg)}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-1 * (var(--tblr-popover-arrow-height)) - var(--tblr-popover-border-width));width:var(--tblr-popover-arrow-height);height:var(--tblr-popover-arrow-width)}.bs-popover-start>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:before,.bs-popover-start>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:after{border-width:calc(var(--tblr-popover-arrow-width) * .5) 0 calc(var(--tblr-popover-arrow-width) * .5) var(--tblr-popover-arrow-height)}.bs-popover-start>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:before{right:0;border-left-color:var(--tblr-popover-arrow-border)}.bs-popover-start>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:after{right:var(--tblr-popover-border-width);border-left-color:var(--tblr-popover-bg)}.popover-header{padding:var(--tblr-popover-header-padding-y) var(--tblr-popover-header-padding-x);margin-bottom:0;font-size:var(--tblr-popover-header-font-size);color:var(--tblr-popover-header-color);background-color:var(--tblr-popover-header-bg);border-bottom:var(--tblr-popover-border-width) solid var(--tblr-popover-border-color);border-top-left-radius:var(--tblr-popover-inner-border-radius);border-top-right-radius:var(--tblr-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--tblr-popover-body-padding-y) var(--tblr-popover-body-padding-x);color:var(--tblr-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner:after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;transition:transform .6s ease-in-out}@media(prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translate(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translate(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;filter:var(--tblr-carousel-control-icon-filter);border:0;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion:reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:1.5rem;height:1.5rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='15 18 9 12 15 6'%3e%3c/polyline%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='9 18 15 12 9 6'%3e%3c/polyline%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:var(--tblr-carousel-indicator-active-bg);background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:var(--tblr-carousel-caption-color);text-align:center}.carousel-dark{--tblr-carousel-indicator-active-bg: #000000;--tblr-carousel-caption-color: #000000;--tblr-carousel-control-icon-filter: invert(1) grayscale(100)}:root,[data-bs-theme=light]{--tblr-carousel-indicator-active-bg: #ffffff;--tblr-carousel-caption-color: #ffffff;--tblr-carousel-control-icon-filter: }[data-bs-theme=dark],body[data-bs-theme=dark] [data-bs-theme=light]{--tblr-carousel-indicator-active-bg: #000000;--tblr-carousel-caption-color: #000000;--tblr-carousel-control-icon-filter: invert(1) grayscale(100)}.spinner-grow,.spinner-border{display:inline-block;flex-shrink:0;width:var(--tblr-spinner-width);height:var(--tblr-spinner-height);vertical-align:var(--tblr-spinner-vertical-align);border-radius:50%;animation:var(--tblr-spinner-animation-speed) linear infinite var(--tblr-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{--tblr-spinner-width: 1.5rem;--tblr-spinner-height: 1.5rem;--tblr-spinner-vertical-align: -.125em;--tblr-spinner-border-width: 2px;--tblr-spinner-animation-speed: .75s;--tblr-spinner-animation-name: spinner-border;border:var(--tblr-spinner-border-width) solid currentcolor;border-right-color:transparent}.spinner-border-sm{--tblr-spinner-width: 1rem;--tblr-spinner-height: 1rem;--tblr-spinner-border-width: 1px}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--tblr-spinner-width: 1.5rem;--tblr-spinner-height: 1.5rem;--tblr-spinner-vertical-align: -.125em;--tblr-spinner-animation-speed: .75s;--tblr-spinner-animation-name: spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--tblr-spinner-width: 1rem;--tblr-spinner-height: 1rem}@media(prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{--tblr-spinner-animation-speed: 1.5s}}.offcanvas,.offcanvas-xxl,.offcanvas-xl,.offcanvas-lg,.offcanvas-md,.offcanvas-sm{--tblr-offcanvas-zindex: 1045;--tblr-offcanvas-width: 400px;--tblr-offcanvas-height: 30vh;--tblr-offcanvas-padding-x: 1.5rem;--tblr-offcanvas-padding-y: 1.5rem;--tblr-offcanvas-color: var(--tblr-body-color);--tblr-offcanvas-bg: var(--tblr-bg-surface);--tblr-offcanvas-border-width: var(--tblr-border-width);--tblr-offcanvas-border-color: var(--tblr-border-color);--tblr-offcanvas-box-shadow: var(--tblr-box-shadow-sm);--tblr-offcanvas-transition: transform .3s ease-in-out;--tblr-offcanvas-title-line-height: 1.4285714286}@media(max-width:575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--tblr-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--tblr-offcanvas-color);visibility:hidden;background-color:var(--tblr-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--tblr-offcanvas-box-shadow);transition:var(--tblr-offcanvas-transition)}}@media(max-width:575.98px)and (prefers-reduced-motion:reduce){.offcanvas-sm{transition:none}}@media(max-width:575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--tblr-offcanvas-width);border-right:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--tblr-offcanvas-width);border-left:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-bottom:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-top:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.showing,.offcanvas-sm.show:not(.hiding){transform:none}.offcanvas-sm.showing,.offcanvas-sm.hiding,.offcanvas-sm.show{visibility:visible}}@media(min-width:576px){.offcanvas-sm{--tblr-offcanvas-height: auto;--tblr-offcanvas-border-width: 0;background-color:transparent!important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media(max-width:767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--tblr-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--tblr-offcanvas-color);visibility:hidden;background-color:var(--tblr-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--tblr-offcanvas-box-shadow);transition:var(--tblr-offcanvas-transition)}}@media(max-width:767.98px)and (prefers-reduced-motion:reduce){.offcanvas-md{transition:none}}@media(max-width:767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--tblr-offcanvas-width);border-right:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--tblr-offcanvas-width);border-left:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-bottom:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-top:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.showing,.offcanvas-md.show:not(.hiding){transform:none}.offcanvas-md.showing,.offcanvas-md.hiding,.offcanvas-md.show{visibility:visible}}@media(min-width:768px){.offcanvas-md{--tblr-offcanvas-height: auto;--tblr-offcanvas-border-width: 0;background-color:transparent!important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media(max-width:991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--tblr-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--tblr-offcanvas-color);visibility:hidden;background-color:var(--tblr-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--tblr-offcanvas-box-shadow);transition:var(--tblr-offcanvas-transition)}}@media(max-width:991.98px)and (prefers-reduced-motion:reduce){.offcanvas-lg{transition:none}}@media(max-width:991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--tblr-offcanvas-width);border-right:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--tblr-offcanvas-width);border-left:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-bottom:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-top:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.showing,.offcanvas-lg.show:not(.hiding){transform:none}.offcanvas-lg.showing,.offcanvas-lg.hiding,.offcanvas-lg.show{visibility:visible}}@media(min-width:992px){.offcanvas-lg{--tblr-offcanvas-height: auto;--tblr-offcanvas-border-width: 0;background-color:transparent!important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media(max-width:1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--tblr-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--tblr-offcanvas-color);visibility:hidden;background-color:var(--tblr-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--tblr-offcanvas-box-shadow);transition:var(--tblr-offcanvas-transition)}}@media(max-width:1199.98px)and (prefers-reduced-motion:reduce){.offcanvas-xl{transition:none}}@media(max-width:1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--tblr-offcanvas-width);border-right:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--tblr-offcanvas-width);border-left:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-bottom:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-top:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.showing,.offcanvas-xl.show:not(.hiding){transform:none}.offcanvas-xl.showing,.offcanvas-xl.hiding,.offcanvas-xl.show{visibility:visible}}@media(min-width:1200px){.offcanvas-xl{--tblr-offcanvas-height: auto;--tblr-offcanvas-border-width: 0;background-color:transparent!important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media(max-width:1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--tblr-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--tblr-offcanvas-color);visibility:hidden;background-color:var(--tblr-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--tblr-offcanvas-box-shadow);transition:var(--tblr-offcanvas-transition)}}@media(max-width:1399.98px)and (prefers-reduced-motion:reduce){.offcanvas-xxl{transition:none}}@media(max-width:1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--tblr-offcanvas-width);border-right:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--tblr-offcanvas-width);border-left:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-bottom:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-top:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.showing,.offcanvas-xxl.show:not(.hiding){transform:none}.offcanvas-xxl.showing,.offcanvas-xxl.hiding,.offcanvas-xxl.show{visibility:visible}}@media(min-width:1400px){.offcanvas-xxl{--tblr-offcanvas-height: auto;--tblr-offcanvas-border-width: 0;background-color:transparent!important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}.offcanvas{position:fixed;bottom:0;z-index:var(--tblr-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--tblr-offcanvas-color);visibility:hidden;background-color:var(--tblr-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--tblr-offcanvas-box-shadow);transition:var(--tblr-offcanvas-transition)}@media(prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--tblr-offcanvas-width);border-right:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--tblr-offcanvas-width);border-left:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-bottom:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-top:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(100%)}.offcanvas.showing,.offcanvas.show:not(.hiding){transform:none}.offcanvas.showing,.offcanvas.hiding,.offcanvas.show{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:var(--tblr-gray-800)}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.24}.offcanvas-header{display:flex;align-items:center;padding:var(--tblr-offcanvas-padding-y) var(--tblr-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--tblr-offcanvas-padding-y) * .5) calc(var(--tblr-offcanvas-padding-x) * .5);margin-top:calc(-.5 * var(--tblr-offcanvas-padding-y));margin-right:calc(-.5 * var(--tblr-offcanvas-padding-x));margin-bottom:calc(-.5 * var(--tblr-offcanvas-padding-y));margin-left:auto}.offcanvas-title{margin-bottom:0;line-height:var(--tblr-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;padding:var(--tblr-offcanvas-padding-y) var(--tblr-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.2}.placeholder.btn:before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.1}}.placeholder-wave{mask-image:linear-gradient(130deg,#000 55%,#000000e6,#000 95%);mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{to{mask-position:-200% 0%}}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.object-fit-contain{object-fit:contain!important}.object-fit-cover{object-fit:cover!important}.object-fit-fill{object-fit:fill!important}.object-fit-scale{object-fit:scale-down!important}.object-fit-none{object-fit:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.overflow-x-auto{overflow-x:auto!important}.overflow-x-hidden{overflow-x:hidden!important}.overflow-x-visible{overflow-x:visible!important}.overflow-x-scroll{overflow-x:scroll!important}.overflow-y-auto{overflow-y:auto!important}.overflow-y-hidden{overflow-y:hidden!important}.overflow-y-visible{overflow-y:visible!important}.overflow-y-scroll{overflow-y:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-inline-grid{display:inline-grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:var(--tblr-box-shadow)!important}.shadow-sm{box-shadow:var(--tblr-box-shadow-sm)!important}.shadow-lg{box-shadow:var(--tblr-box-shadow-lg)!important}.shadow-none{box-shadow:none!important}.focus-ring-primary{--tblr-focus-ring-color: rgba(var(--tblr-primary-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-secondary{--tblr-focus-ring-color: rgba(var(--tblr-secondary-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-success{--tblr-focus-ring-color: rgba(var(--tblr-success-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-info{--tblr-focus-ring-color: rgba(var(--tblr-info-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-warning{--tblr-focus-ring-color: rgba(var(--tblr-warning-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-danger{--tblr-focus-ring-color: rgba(var(--tblr-danger-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-light{--tblr-focus-ring-color: rgba(var(--tblr-light-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-dark{--tblr-focus-ring-color: rgba(var(--tblr-dark-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-muted{--tblr-focus-ring-color: rgba(var(--tblr-muted-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-blue{--tblr-focus-ring-color: rgba(var(--tblr-blue-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-azure{--tblr-focus-ring-color: rgba(var(--tblr-azure-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-indigo{--tblr-focus-ring-color: rgba(var(--tblr-indigo-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-purple{--tblr-focus-ring-color: rgba(var(--tblr-purple-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-pink{--tblr-focus-ring-color: rgba(var(--tblr-pink-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-red{--tblr-focus-ring-color: rgba(var(--tblr-red-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-orange{--tblr-focus-ring-color: rgba(var(--tblr-orange-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-yellow{--tblr-focus-ring-color: rgba(var(--tblr-yellow-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-lime{--tblr-focus-ring-color: rgba(var(--tblr-lime-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-green{--tblr-focus-ring-color: rgba(var(--tblr-green-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-teal{--tblr-focus-ring-color: rgba(var(--tblr-teal-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-cyan{--tblr-focus-ring-color: rgba(var(--tblr-cyan-rgb), var(--tblr-focus-ring-opacity))}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translate(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.border-wide{border:2px var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.border-0{border:0!important}.border-top{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.border-top-wide{border-top:2px var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.border-top-0{border-top:0!important}.border-end{border-right:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.border-end-wide{border-right:2px var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.border-bottom-wide{border-bottom:2px var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.border-start-wide{border-left:2px var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.border-start-0{border-left:0!important}.border-red{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-red-rgb),var(--tblr-border-opacity))!important}.border-green{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-green-rgb),var(--tblr-border-opacity))!important}.border-primary-subtle{border-color:var(--tblr-primary-border-subtle)!important}.border-secondary-subtle{border-color:var(--tblr-secondary-border-subtle)!important}.border-success-subtle{border-color:var(--tblr-success-border-subtle)!important}.border-info-subtle{border-color:var(--tblr-info-border-subtle)!important}.border-warning-subtle{border-color:var(--tblr-warning-border-subtle)!important}.border-danger-subtle{border-color:var(--tblr-danger-border-subtle)!important}.border-light-subtle{border-color:var(--tblr-light-border-subtle)!important}.border-dark-subtle{border-color:var(--tblr-dark-border-subtle)!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.border-opacity-10{--tblr-border-opacity: .1}.border-opacity-25{--tblr-border-opacity: .25}.border-opacity-50{--tblr-border-opacity: .5}.border-opacity-75{--tblr-border-opacity: .75}.border-opacity-100{--tblr-border-opacity: 1}.w-25{width:25%!important}.w-33{width:33.33333%!important}.w-50{width:50%!important}.w-66{width:66.66666%!important}.w-75{width:75%!important}.w-100{width:100%!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-33{height:33.33333%!important}.h-50{height:50%!important}.h-66{height:66.66666%!important}.h-75{height:75%!important}.h-100{height:100%!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:2rem!important}.m-6{margin:2.5rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:2rem!important;margin-left:2rem!important}.mx-6{margin-right:2.5rem!important;margin-left:2.5rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:2rem!important;margin-bottom:2rem!important}.my-6{margin-top:2.5rem!important;margin-bottom:2.5rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:2rem!important}.mt-6{margin-top:2.5rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:2rem!important}.me-6{margin-right:2.5rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:2rem!important}.mb-6{margin-bottom:2.5rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:2rem!important}.ms-6{margin-left:2.5rem!important}.ms-auto{margin-left:auto!important}.m-n1{margin:-.25rem!important}.m-n2{margin:-.5rem!important}.m-n3{margin:-1rem!important}.m-n4{margin:-1.5rem!important}.m-n5{margin:-2rem!important}.m-n6{margin:-2.5rem!important}.mx-n1{margin-right:-.25rem!important;margin-left:-.25rem!important}.mx-n2{margin-right:-.5rem!important;margin-left:-.5rem!important}.mx-n3{margin-right:-1rem!important;margin-left:-1rem!important}.mx-n4{margin-right:-1.5rem!important;margin-left:-1.5rem!important}.mx-n5{margin-right:-2rem!important;margin-left:-2rem!important}.mx-n6{margin-right:-2.5rem!important;margin-left:-2.5rem!important}.my-n1{margin-top:-.25rem!important;margin-bottom:-.25rem!important}.my-n2{margin-top:-.5rem!important;margin-bottom:-.5rem!important}.my-n3{margin-top:-1rem!important;margin-bottom:-1rem!important}.my-n4{margin-top:-1.5rem!important;margin-bottom:-1.5rem!important}.my-n5{margin-top:-2rem!important;margin-bottom:-2rem!important}.my-n6{margin-top:-2.5rem!important;margin-bottom:-2.5rem!important}.mt-n1{margin-top:-.25rem!important}.mt-n2{margin-top:-.5rem!important}.mt-n3{margin-top:-1rem!important}.mt-n4{margin-top:-1.5rem!important}.mt-n5{margin-top:-2rem!important}.mt-n6{margin-top:-2.5rem!important}.me-n1{margin-right:-.25rem!important}.me-n2{margin-right:-.5rem!important}.me-n3{margin-right:-1rem!important}.me-n4{margin-right:-1.5rem!important}.me-n5{margin-right:-2rem!important}.me-n6{margin-right:-2.5rem!important}.mb-n1{margin-bottom:-.25rem!important}.mb-n2{margin-bottom:-.5rem!important}.mb-n3{margin-bottom:-1rem!important}.mb-n4{margin-bottom:-1.5rem!important}.mb-n5{margin-bottom:-2rem!important}.mb-n6{margin-bottom:-2.5rem!important}.ms-n1{margin-left:-.25rem!important}.ms-n2{margin-left:-.5rem!important}.ms-n3{margin-left:-1rem!important}.ms-n4{margin-left:-1.5rem!important}.ms-n5{margin-left:-2rem!important}.ms-n6{margin-left:-2.5rem!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:2rem!important}.p-6{padding:2.5rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:2rem!important;padding-left:2rem!important}.px-6{padding-right:2.5rem!important;padding-left:2.5rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:2rem!important;padding-bottom:2rem!important}.py-6{padding-top:2.5rem!important;padding-bottom:2.5rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:2rem!important}.pt-6{padding-top:2.5rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:2rem!important}.pe-6{padding-right:2.5rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:2rem!important}.pb-6{padding-bottom:2.5rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:2rem!important}.ps-6{padding-left:2.5rem!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:2rem!important}.gap-6{gap:2.5rem!important}.row-gap-0{row-gap:0!important}.row-gap-1{row-gap:.25rem!important}.row-gap-2{row-gap:.5rem!important}.row-gap-3{row-gap:1rem!important}.row-gap-4{row-gap:1.5rem!important}.row-gap-5{row-gap:2rem!important}.row-gap-6{row-gap:2.5rem!important}.column-gap-0{column-gap:0!important}.column-gap-1{column-gap:.25rem!important}.column-gap-2{column-gap:.5rem!important}.column-gap-3{column-gap:1rem!important}.column-gap-4{column-gap:1.5rem!important}.column-gap-5{column-gap:2rem!important}.column-gap-6{column-gap:2.5rem!important}.font-monospace{font-family:var(--tblr-font-monospace)!important}.fs-1{font-size:1.5rem!important}.fs-2{font-size:1.25rem!important}.fs-3{font-size:1rem!important}.fs-4{font-size:.875rem!important}.fs-5{font-size:.75rem!important}.fs-6{font-size:.625rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-lighter{font-weight:lighter!important}.fw-light{font-weight:300!important}.fw-normal{font-weight:400!important}.fw-medium{font-weight:500!important}.fw-semibold,.fw-bold{font-weight:600!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.1428571429!important}.lh-base{line-height:1.4285714286!important}.lh-lg{line-height:1.7142857143!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--tblr-text-opacity: 1;color:rgba(var(--tblr-primary-rgb),var(--tblr-text-opacity))!important}.text-secondary{--tblr-text-opacity: 1;color:rgba(var(--tblr-secondary-rgb),var(--tblr-text-opacity))!important}.text-success{--tblr-text-opacity: 1;color:rgba(var(--tblr-success-rgb),var(--tblr-text-opacity))!important}.text-info{--tblr-text-opacity: 1;color:rgba(var(--tblr-info-rgb),var(--tblr-text-opacity))!important}.text-warning{--tblr-text-opacity: 1;color:rgba(var(--tblr-warning-rgb),var(--tblr-text-opacity))!important}.text-danger{--tblr-text-opacity: 1;color:rgba(var(--tblr-danger-rgb),var(--tblr-text-opacity))!important}.text-light{--tblr-text-opacity: 1;color:rgba(var(--tblr-light-rgb),var(--tblr-text-opacity))!important}.text-dark{--tblr-text-opacity: 1;color:rgba(var(--tblr-dark-rgb),var(--tblr-text-opacity))!important}.text-muted{--tblr-text-opacity: 1;color:var(--tblr-secondary-color)!important}.text-blue{--tblr-text-opacity: 1;color:rgba(var(--tblr-blue-rgb),var(--tblr-text-opacity))!important}.text-azure{--tblr-text-opacity: 1;color:rgba(var(--tblr-azure-rgb),var(--tblr-text-opacity))!important}.text-indigo{--tblr-text-opacity: 1;color:rgba(var(--tblr-indigo-rgb),var(--tblr-text-opacity))!important}.text-purple{--tblr-text-opacity: 1;color:rgba(var(--tblr-purple-rgb),var(--tblr-text-opacity))!important}.text-pink{--tblr-text-opacity: 1;color:rgba(var(--tblr-pink-rgb),var(--tblr-text-opacity))!important}.text-red{--tblr-text-opacity: 1;color:rgba(var(--tblr-red-rgb),var(--tblr-text-opacity))!important}.text-orange{--tblr-text-opacity: 1;color:rgba(var(--tblr-orange-rgb),var(--tblr-text-opacity))!important}.text-yellow{--tblr-text-opacity: 1;color:rgba(var(--tblr-yellow-rgb),var(--tblr-text-opacity))!important}.text-lime{--tblr-text-opacity: 1;color:rgba(var(--tblr-lime-rgb),var(--tblr-text-opacity))!important}.text-green{--tblr-text-opacity: 1;color:rgba(var(--tblr-green-rgb),var(--tblr-text-opacity))!important}.text-teal{--tblr-text-opacity: 1;color:rgba(var(--tblr-teal-rgb),var(--tblr-text-opacity))!important}.text-cyan{--tblr-text-opacity: 1;color:rgba(var(--tblr-cyan-rgb),var(--tblr-text-opacity))!important}.text-black{--tblr-text-opacity: 1;color:rgba(var(--tblr-black-rgb),var(--tblr-text-opacity))!important}.text-white{--tblr-text-opacity: 1;color:rgba(var(--tblr-white-rgb),var(--tblr-text-opacity))!important}.text-body{--tblr-text-opacity: 1;color:rgba(var(--tblr-body-color-rgb),var(--tblr-text-opacity))!important}.text-black-50{--tblr-text-opacity: 1;color:#00000080!important}.text-white-50{--tblr-text-opacity: 1;color:#ffffff80!important}.text-body-secondary{--tblr-text-opacity: 1;color:var(--tblr-secondary-color)!important}.text-body-tertiary{--tblr-text-opacity: 1;color:var(--tblr-tertiary-color)!important}.text-body-emphasis{--tblr-text-opacity: 1;color:var(--tblr-emphasis-color)!important}.text-reset{--tblr-text-opacity: 1;color:inherit!important}.text-opacity-25{--tblr-text-opacity: .25}.text-opacity-50{--tblr-text-opacity: .5}.text-opacity-75{--tblr-text-opacity: .75}.text-opacity-100{--tblr-text-opacity: 1}.text-primary-emphasis{color:var(--tblr-primary-text-emphasis)!important}.text-secondary-emphasis{color:var(--tblr-secondary-text-emphasis)!important}.text-success-emphasis{color:var(--tblr-success-text-emphasis)!important}.text-info-emphasis{color:var(--tblr-info-text-emphasis)!important}.text-warning-emphasis{color:var(--tblr-warning-text-emphasis)!important}.text-danger-emphasis{color:var(--tblr-danger-text-emphasis)!important}.text-light-emphasis{color:var(--tblr-light-text-emphasis)!important}.text-dark-emphasis{color:var(--tblr-dark-text-emphasis)!important}.link-opacity-10,.link-opacity-10-hover:hover{--tblr-link-opacity: .1}.link-opacity-25,.link-opacity-25-hover:hover{--tblr-link-opacity: .25}.link-opacity-50,.link-opacity-50-hover:hover{--tblr-link-opacity: .5}.link-opacity-75,.link-opacity-75-hover:hover{--tblr-link-opacity: .75}.link-opacity-100,.link-opacity-100-hover:hover{--tblr-link-opacity: 1}.link-offset-1,.link-offset-1-hover:hover{text-underline-offset:.125em!important}.link-offset-2,.link-offset-2-hover:hover{text-underline-offset:.25em!important}.link-offset-3,.link-offset-3-hover:hover{text-underline-offset:.375em!important}.link-underline-primary{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-primary-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-secondary{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-secondary-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-success{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-success-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-info{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-info-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-warning{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-warning-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-danger{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-danger-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-light{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-light-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-dark{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-dark-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-muted{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-muted-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-blue{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-blue-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-azure{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-azure-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-indigo{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-indigo-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-purple{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-purple-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-pink{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-pink-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-red{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-red-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-orange{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-orange-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-yellow{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-yellow-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-lime{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-lime-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-green{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-green-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-teal{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-teal-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-cyan{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-cyan-rgb),var(--tblr-link-underline-opacity))!important}.link-underline{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-link-color-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-underline-opacity-0,.link-underline-opacity-0-hover:hover{--tblr-link-underline-opacity: 0}.link-underline-opacity-10,.link-underline-opacity-10-hover:hover{--tblr-link-underline-opacity: .1}.link-underline-opacity-25,.link-underline-opacity-25-hover:hover{--tblr-link-underline-opacity: .25}.link-underline-opacity-50,.link-underline-opacity-50-hover:hover{--tblr-link-underline-opacity: .5}.link-underline-opacity-75,.link-underline-opacity-75-hover:hover{--tblr-link-underline-opacity: .75}.link-underline-opacity-100,.link-underline-opacity-100-hover:hover{--tblr-link-underline-opacity: 1}.bg-primary{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-primary-rgb),var(--tblr-bg-opacity))!important}.bg-secondary{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-secondary-rgb),var(--tblr-bg-opacity))!important}.bg-success{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-success-rgb),var(--tblr-bg-opacity))!important}.bg-info{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-info-rgb),var(--tblr-bg-opacity))!important}.bg-warning{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-warning-rgb),var(--tblr-bg-opacity))!important}.bg-danger{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-danger-rgb),var(--tblr-bg-opacity))!important}.bg-light{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-light-rgb),var(--tblr-bg-opacity))!important}.bg-dark{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-dark-rgb),var(--tblr-bg-opacity))!important}.bg-muted{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-muted-rgb),var(--tblr-bg-opacity))!important}.bg-blue{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-blue-rgb),var(--tblr-bg-opacity))!important}.bg-azure{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-azure-rgb),var(--tblr-bg-opacity))!important}.bg-indigo{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-indigo-rgb),var(--tblr-bg-opacity))!important}.bg-purple{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-purple-rgb),var(--tblr-bg-opacity))!important}.bg-pink{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-pink-rgb),var(--tblr-bg-opacity))!important}.bg-red{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-red-rgb),var(--tblr-bg-opacity))!important}.bg-orange{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-orange-rgb),var(--tblr-bg-opacity))!important}.bg-yellow{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-yellow-rgb),var(--tblr-bg-opacity))!important}.bg-lime{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-lime-rgb),var(--tblr-bg-opacity))!important}.bg-green{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-green-rgb),var(--tblr-bg-opacity))!important}.bg-teal{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-teal-rgb),var(--tblr-bg-opacity))!important}.bg-cyan{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-cyan-rgb),var(--tblr-bg-opacity))!important}.bg-black{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-black-rgb),var(--tblr-bg-opacity))!important}.bg-white{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-white-rgb),var(--tblr-bg-opacity))!important}.bg-body{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-body-bg-rgb),var(--tblr-bg-opacity))!important}.bg-transparent{--tblr-bg-opacity: 1;background-color:transparent!important}.bg-body-secondary{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-secondary-bg-rgb),var(--tblr-bg-opacity))!important}.bg-body-tertiary{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-tertiary-bg-rgb),var(--tblr-bg-opacity))!important}.bg-opacity-10{--tblr-bg-opacity: .1}.bg-opacity-25{--tblr-bg-opacity: .25}.bg-opacity-50{--tblr-bg-opacity: .5}.bg-opacity-75{--tblr-bg-opacity: .75}.bg-opacity-100{--tblr-bg-opacity: 1}.bg-primary-subtle{background-color:var(--tblr-primary-bg-subtle)!important}.bg-secondary-subtle{background-color:var(--tblr-secondary-bg-subtle)!important}.bg-success-subtle{background-color:var(--tblr-success-bg-subtle)!important}.bg-info-subtle{background-color:var(--tblr-info-bg-subtle)!important}.bg-warning-subtle{background-color:var(--tblr-warning-bg-subtle)!important}.bg-danger-subtle{background-color:var(--tblr-danger-bg-subtle)!important}.bg-light-subtle{background-color:var(--tblr-light-bg-subtle)!important}.bg-dark-subtle{background-color:var(--tblr-dark-bg-subtle)!important}.bg-gradient{background-image:var(--tblr-gradient)!important}.user-select-all{user-select:all!important}.user-select-auto{user-select:auto!important}.user-select-none{user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:var(--tblr-border-radius)!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:var(--tblr-border-radius-sm)!important}.rounded-2{border-radius:var(--tblr-border-radius)!important}.rounded-3{border-radius:var(--tblr-border-radius-lg)!important}.rounded-4{border-radius:var(--tblr-border-radius-xl)!important}.rounded-5{border-radius:var(--tblr-border-radius-xxl)!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:var(--tblr-border-radius-pill)!important}.rounded-top{border-top-left-radius:var(--tblr-border-radius)!important;border-top-right-radius:var(--tblr-border-radius)!important}.rounded-top-0{border-top-left-radius:0!important;border-top-right-radius:0!important}.rounded-top-1{border-top-left-radius:var(--tblr-border-radius-sm)!important;border-top-right-radius:var(--tblr-border-radius-sm)!important}.rounded-top-2{border-top-left-radius:var(--tblr-border-radius)!important;border-top-right-radius:var(--tblr-border-radius)!important}.rounded-top-3{border-top-left-radius:var(--tblr-border-radius-lg)!important;border-top-right-radius:var(--tblr-border-radius-lg)!important}.rounded-top-4{border-top-left-radius:var(--tblr-border-radius-xl)!important;border-top-right-radius:var(--tblr-border-radius-xl)!important}.rounded-top-5{border-top-left-radius:var(--tblr-border-radius-xxl)!important;border-top-right-radius:var(--tblr-border-radius-xxl)!important}.rounded-top-circle{border-top-left-radius:50%!important;border-top-right-radius:50%!important}.rounded-top-pill{border-top-left-radius:var(--tblr-border-radius-pill)!important;border-top-right-radius:var(--tblr-border-radius-pill)!important}.rounded-end{border-top-right-radius:var(--tblr-border-radius)!important;border-bottom-right-radius:var(--tblr-border-radius)!important}.rounded-end-0{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.rounded-end-1{border-top-right-radius:var(--tblr-border-radius-sm)!important;border-bottom-right-radius:var(--tblr-border-radius-sm)!important}.rounded-end-2{border-top-right-radius:var(--tblr-border-radius)!important;border-bottom-right-radius:var(--tblr-border-radius)!important}.rounded-end-3{border-top-right-radius:var(--tblr-border-radius-lg)!important;border-bottom-right-radius:var(--tblr-border-radius-lg)!important}.rounded-end-4{border-top-right-radius:var(--tblr-border-radius-xl)!important;border-bottom-right-radius:var(--tblr-border-radius-xl)!important}.rounded-end-5{border-top-right-radius:var(--tblr-border-radius-xxl)!important;border-bottom-right-radius:var(--tblr-border-radius-xxl)!important}.rounded-end-circle{border-top-right-radius:50%!important;border-bottom-right-radius:50%!important}.rounded-end-pill{border-top-right-radius:var(--tblr-border-radius-pill)!important;border-bottom-right-radius:var(--tblr-border-radius-pill)!important}.rounded-bottom{border-bottom-right-radius:var(--tblr-border-radius)!important;border-bottom-left-radius:var(--tblr-border-radius)!important}.rounded-bottom-0{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.rounded-bottom-1{border-bottom-right-radius:var(--tblr-border-radius-sm)!important;border-bottom-left-radius:var(--tblr-border-radius-sm)!important}.rounded-bottom-2{border-bottom-right-radius:var(--tblr-border-radius)!important;border-bottom-left-radius:var(--tblr-border-radius)!important}.rounded-bottom-3{border-bottom-right-radius:var(--tblr-border-radius-lg)!important;border-bottom-left-radius:var(--tblr-border-radius-lg)!important}.rounded-bottom-4{border-bottom-right-radius:var(--tblr-border-radius-xl)!important;border-bottom-left-radius:var(--tblr-border-radius-xl)!important}.rounded-bottom-5{border-bottom-right-radius:var(--tblr-border-radius-xxl)!important;border-bottom-left-radius:var(--tblr-border-radius-xxl)!important}.rounded-bottom-circle{border-bottom-right-radius:50%!important;border-bottom-left-radius:50%!important}.rounded-bottom-pill{border-bottom-right-radius:var(--tblr-border-radius-pill)!important;border-bottom-left-radius:var(--tblr-border-radius-pill)!important}.rounded-start{border-bottom-left-radius:var(--tblr-border-radius)!important;border-top-left-radius:var(--tblr-border-radius)!important}.rounded-start-0{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.rounded-start-1{border-bottom-left-radius:var(--tblr-border-radius-sm)!important;border-top-left-radius:var(--tblr-border-radius-sm)!important}.rounded-start-2{border-bottom-left-radius:var(--tblr-border-radius)!important;border-top-left-radius:var(--tblr-border-radius)!important}.rounded-start-3{border-bottom-left-radius:var(--tblr-border-radius-lg)!important;border-top-left-radius:var(--tblr-border-radius-lg)!important}.rounded-start-4{border-bottom-left-radius:var(--tblr-border-radius-xl)!important;border-top-left-radius:var(--tblr-border-radius-xl)!important}.rounded-start-5{border-bottom-left-radius:var(--tblr-border-radius-xxl)!important;border-top-left-radius:var(--tblr-border-radius-xxl)!important}.rounded-start-circle{border-bottom-left-radius:50%!important;border-top-left-radius:50%!important}.rounded-start-pill{border-bottom-left-radius:var(--tblr-border-radius-pill)!important;border-top-left-radius:var(--tblr-border-radius-pill)!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.z-n1{z-index:-1!important}.z-0{z-index:0!important}.z-1{z-index:1!important}.z-2{z-index:2!important}.z-3{z-index:3!important}.object-contain{object-fit:contain!important}.object-cover{object-fit:cover!important}.object-fill{object-fit:fill!important}.object-scale-down{object-fit:scale-down!important}.object-none{object-fit:none!important}.cursor-auto{cursor:auto!important}.cursor-pointer{cursor:pointer!important}.cursor-move{cursor:move!important}.cursor-not-allowed{cursor:not-allowed!important}.cursor-zoom-in{cursor:zoom-in!important}.cursor-zoom-out{cursor:zoom-out!important}.cursor-default{cursor:default!important}.cursor-none{cursor:none!important}.cursor-help{cursor:help!important}.cursor-progress{cursor:progress!important}.cursor-wait{cursor:wait!important}.cursor-text{cursor:text!important}.cursor-v-text{cursor:vertical-text!important}.cursor-grab{cursor:grab!important}.cursor-grabbing{cursor:grabbing!important}.cursor-crosshair{cursor:crosshair!important}.border-x{border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important;border-right:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.border-x-wide{border-left:2px var(--tblr-border-style) var(--tblr-border-color-translucent)!important;border-right:2px var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.border-x-0{border-left:0!important;border-right:0!important}.border-y{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important;border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.border-y-wide{border-top:2px var(--tblr-border-style) var(--tblr-border-color-translucent)!important;border-bottom:2px var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.border-y-0{border-top:0!important;border-bottom:0!important}.columns-2{columns:2!important}.columns-3{columns:3!important}.columns-4{columns:4!important}.bg-pattern-transparent{background:url('data:image/svg+xml;charset=UTF-8,') repeat center/16px 16px!important}.bg-gradient{background:linear-gradient(var(--tblr-gradient-direction, to right),var(--tblr-gradient-stops, var(--tblr-gradient-from, transparent), var(--tblr-gradient-to, transparent))) no-repeat!important}.bg-gradient-to-t{--tblr-gradient-direction: to top !important}.bg-gradient-to-te{--tblr-gradient-direction: to top right !important}.bg-gradient-to-e{--tblr-gradient-direction: to right !important}.bg-gradient-to-be{--tblr-gradient-direction: to bottom right !important}.bg-gradient-to-b{--tblr-gradient-direction: to bottom !important}.bg-gradient-to-bs{--tblr-gradient-direction: to bottom left !important}.bg-gradient-to-s{--tblr-gradient-direction: to left !important}.bg-gradient-to-ts{--tblr-gradient-direction: to top left !important}.table-auto{table-layout:auto!important}.table-fixed{table-layout:fixed!important}@media(min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.object-fit-sm-contain{object-fit:contain!important}.object-fit-sm-cover{object-fit:cover!important}.object-fit-sm-fill{object-fit:fill!important}.object-fit-sm-scale{object-fit:scale-down!important}.object-fit-sm-none{object-fit:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-inline-grid{display:inline-grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:2rem!important}.m-sm-6{margin:2.5rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:2rem!important;margin-left:2rem!important}.mx-sm-6{margin-right:2.5rem!important;margin-left:2.5rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:2rem!important;margin-bottom:2rem!important}.my-sm-6{margin-top:2.5rem!important;margin-bottom:2.5rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:2rem!important}.mt-sm-6{margin-top:2.5rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:2rem!important}.me-sm-6{margin-right:2.5rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:2rem!important}.mb-sm-6{margin-bottom:2.5rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:2rem!important}.ms-sm-6{margin-left:2.5rem!important}.ms-sm-auto{margin-left:auto!important}.m-sm-n1{margin:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.m-sm-n3{margin:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.m-sm-n5{margin:-2rem!important}.m-sm-n6{margin:-2.5rem!important}.mx-sm-n1{margin-right:-.25rem!important;margin-left:-.25rem!important}.mx-sm-n2{margin-right:-.5rem!important;margin-left:-.5rem!important}.mx-sm-n3{margin-right:-1rem!important;margin-left:-1rem!important}.mx-sm-n4{margin-right:-1.5rem!important;margin-left:-1.5rem!important}.mx-sm-n5{margin-right:-2rem!important;margin-left:-2rem!important}.mx-sm-n6{margin-right:-2.5rem!important;margin-left:-2.5rem!important}.my-sm-n1{margin-top:-.25rem!important;margin-bottom:-.25rem!important}.my-sm-n2{margin-top:-.5rem!important;margin-bottom:-.5rem!important}.my-sm-n3{margin-top:-1rem!important;margin-bottom:-1rem!important}.my-sm-n4{margin-top:-1.5rem!important;margin-bottom:-1.5rem!important}.my-sm-n5{margin-top:-2rem!important;margin-bottom:-2rem!important}.my-sm-n6{margin-top:-2.5rem!important;margin-bottom:-2.5rem!important}.mt-sm-n1{margin-top:-.25rem!important}.mt-sm-n2{margin-top:-.5rem!important}.mt-sm-n3{margin-top:-1rem!important}.mt-sm-n4{margin-top:-1.5rem!important}.mt-sm-n5{margin-top:-2rem!important}.mt-sm-n6{margin-top:-2.5rem!important}.me-sm-n1{margin-right:-.25rem!important}.me-sm-n2{margin-right:-.5rem!important}.me-sm-n3{margin-right:-1rem!important}.me-sm-n4{margin-right:-1.5rem!important}.me-sm-n5{margin-right:-2rem!important}.me-sm-n6{margin-right:-2.5rem!important}.mb-sm-n1{margin-bottom:-.25rem!important}.mb-sm-n2{margin-bottom:-.5rem!important}.mb-sm-n3{margin-bottom:-1rem!important}.mb-sm-n4{margin-bottom:-1.5rem!important}.mb-sm-n5{margin-bottom:-2rem!important}.mb-sm-n6{margin-bottom:-2.5rem!important}.ms-sm-n1{margin-left:-.25rem!important}.ms-sm-n2{margin-left:-.5rem!important}.ms-sm-n3{margin-left:-1rem!important}.ms-sm-n4{margin-left:-1.5rem!important}.ms-sm-n5{margin-left:-2rem!important}.ms-sm-n6{margin-left:-2.5rem!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:2rem!important}.p-sm-6{padding:2.5rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:2rem!important;padding-left:2rem!important}.px-sm-6{padding-right:2.5rem!important;padding-left:2.5rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:2rem!important;padding-bottom:2rem!important}.py-sm-6{padding-top:2.5rem!important;padding-bottom:2.5rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:2rem!important}.pt-sm-6{padding-top:2.5rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:2rem!important}.pe-sm-6{padding-right:2.5rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:2rem!important}.pb-sm-6{padding-bottom:2.5rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:2rem!important}.ps-sm-6{padding-left:2.5rem!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:2rem!important}.gap-sm-6{gap:2.5rem!important}.row-gap-sm-0{row-gap:0!important}.row-gap-sm-1{row-gap:.25rem!important}.row-gap-sm-2{row-gap:.5rem!important}.row-gap-sm-3{row-gap:1rem!important}.row-gap-sm-4{row-gap:1.5rem!important}.row-gap-sm-5{row-gap:2rem!important}.row-gap-sm-6{row-gap:2.5rem!important}.column-gap-sm-0{column-gap:0!important}.column-gap-sm-1{column-gap:.25rem!important}.column-gap-sm-2{column-gap:.5rem!important}.column-gap-sm-3{column-gap:1rem!important}.column-gap-sm-4{column-gap:1.5rem!important}.column-gap-sm-5{column-gap:2rem!important}.column-gap-sm-6{column-gap:2.5rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}.columns-sm-2{columns:2!important}.columns-sm-3{columns:3!important}.columns-sm-4{columns:4!important}}@media(min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.object-fit-md-contain{object-fit:contain!important}.object-fit-md-cover{object-fit:cover!important}.object-fit-md-fill{object-fit:fill!important}.object-fit-md-scale{object-fit:scale-down!important}.object-fit-md-none{object-fit:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-inline-grid{display:inline-grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:2rem!important}.m-md-6{margin:2.5rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:2rem!important;margin-left:2rem!important}.mx-md-6{margin-right:2.5rem!important;margin-left:2.5rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:2rem!important;margin-bottom:2rem!important}.my-md-6{margin-top:2.5rem!important;margin-bottom:2.5rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:2rem!important}.mt-md-6{margin-top:2.5rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:2rem!important}.me-md-6{margin-right:2.5rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:2rem!important}.mb-md-6{margin-bottom:2.5rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:2rem!important}.ms-md-6{margin-left:2.5rem!important}.ms-md-auto{margin-left:auto!important}.m-md-n1{margin:-.25rem!important}.m-md-n2{margin:-.5rem!important}.m-md-n3{margin:-1rem!important}.m-md-n4{margin:-1.5rem!important}.m-md-n5{margin:-2rem!important}.m-md-n6{margin:-2.5rem!important}.mx-md-n1{margin-right:-.25rem!important;margin-left:-.25rem!important}.mx-md-n2{margin-right:-.5rem!important;margin-left:-.5rem!important}.mx-md-n3{margin-right:-1rem!important;margin-left:-1rem!important}.mx-md-n4{margin-right:-1.5rem!important;margin-left:-1.5rem!important}.mx-md-n5{margin-right:-2rem!important;margin-left:-2rem!important}.mx-md-n6{margin-right:-2.5rem!important;margin-left:-2.5rem!important}.my-md-n1{margin-top:-.25rem!important;margin-bottom:-.25rem!important}.my-md-n2{margin-top:-.5rem!important;margin-bottom:-.5rem!important}.my-md-n3{margin-top:-1rem!important;margin-bottom:-1rem!important}.my-md-n4{margin-top:-1.5rem!important;margin-bottom:-1.5rem!important}.my-md-n5{margin-top:-2rem!important;margin-bottom:-2rem!important}.my-md-n6{margin-top:-2.5rem!important;margin-bottom:-2.5rem!important}.mt-md-n1{margin-top:-.25rem!important}.mt-md-n2{margin-top:-.5rem!important}.mt-md-n3{margin-top:-1rem!important}.mt-md-n4{margin-top:-1.5rem!important}.mt-md-n5{margin-top:-2rem!important}.mt-md-n6{margin-top:-2.5rem!important}.me-md-n1{margin-right:-.25rem!important}.me-md-n2{margin-right:-.5rem!important}.me-md-n3{margin-right:-1rem!important}.me-md-n4{margin-right:-1.5rem!important}.me-md-n5{margin-right:-2rem!important}.me-md-n6{margin-right:-2.5rem!important}.mb-md-n1{margin-bottom:-.25rem!important}.mb-md-n2{margin-bottom:-.5rem!important}.mb-md-n3{margin-bottom:-1rem!important}.mb-md-n4{margin-bottom:-1.5rem!important}.mb-md-n5{margin-bottom:-2rem!important}.mb-md-n6{margin-bottom:-2.5rem!important}.ms-md-n1{margin-left:-.25rem!important}.ms-md-n2{margin-left:-.5rem!important}.ms-md-n3{margin-left:-1rem!important}.ms-md-n4{margin-left:-1.5rem!important}.ms-md-n5{margin-left:-2rem!important}.ms-md-n6{margin-left:-2.5rem!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:2rem!important}.p-md-6{padding:2.5rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:2rem!important;padding-left:2rem!important}.px-md-6{padding-right:2.5rem!important;padding-left:2.5rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:2rem!important;padding-bottom:2rem!important}.py-md-6{padding-top:2.5rem!important;padding-bottom:2.5rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:2rem!important}.pt-md-6{padding-top:2.5rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:2rem!important}.pe-md-6{padding-right:2.5rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:2rem!important}.pb-md-6{padding-bottom:2.5rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:2rem!important}.ps-md-6{padding-left:2.5rem!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:2rem!important}.gap-md-6{gap:2.5rem!important}.row-gap-md-0{row-gap:0!important}.row-gap-md-1{row-gap:.25rem!important}.row-gap-md-2{row-gap:.5rem!important}.row-gap-md-3{row-gap:1rem!important}.row-gap-md-4{row-gap:1.5rem!important}.row-gap-md-5{row-gap:2rem!important}.row-gap-md-6{row-gap:2.5rem!important}.column-gap-md-0{column-gap:0!important}.column-gap-md-1{column-gap:.25rem!important}.column-gap-md-2{column-gap:.5rem!important}.column-gap-md-3{column-gap:1rem!important}.column-gap-md-4{column-gap:1.5rem!important}.column-gap-md-5{column-gap:2rem!important}.column-gap-md-6{column-gap:2.5rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}.columns-md-2{columns:2!important}.columns-md-3{columns:3!important}.columns-md-4{columns:4!important}}@media(min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.object-fit-lg-contain{object-fit:contain!important}.object-fit-lg-cover{object-fit:cover!important}.object-fit-lg-fill{object-fit:fill!important}.object-fit-lg-scale{object-fit:scale-down!important}.object-fit-lg-none{object-fit:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-inline-grid{display:inline-grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:2rem!important}.m-lg-6{margin:2.5rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:2rem!important;margin-left:2rem!important}.mx-lg-6{margin-right:2.5rem!important;margin-left:2.5rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:2rem!important;margin-bottom:2rem!important}.my-lg-6{margin-top:2.5rem!important;margin-bottom:2.5rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:2rem!important}.mt-lg-6{margin-top:2.5rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:2rem!important}.me-lg-6{margin-right:2.5rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:2rem!important}.mb-lg-6{margin-bottom:2.5rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:2rem!important}.ms-lg-6{margin-left:2.5rem!important}.ms-lg-auto{margin-left:auto!important}.m-lg-n1{margin:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.m-lg-n3{margin:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.m-lg-n5{margin:-2rem!important}.m-lg-n6{margin:-2.5rem!important}.mx-lg-n1{margin-right:-.25rem!important;margin-left:-.25rem!important}.mx-lg-n2{margin-right:-.5rem!important;margin-left:-.5rem!important}.mx-lg-n3{margin-right:-1rem!important;margin-left:-1rem!important}.mx-lg-n4{margin-right:-1.5rem!important;margin-left:-1.5rem!important}.mx-lg-n5{margin-right:-2rem!important;margin-left:-2rem!important}.mx-lg-n6{margin-right:-2.5rem!important;margin-left:-2.5rem!important}.my-lg-n1{margin-top:-.25rem!important;margin-bottom:-.25rem!important}.my-lg-n2{margin-top:-.5rem!important;margin-bottom:-.5rem!important}.my-lg-n3{margin-top:-1rem!important;margin-bottom:-1rem!important}.my-lg-n4{margin-top:-1.5rem!important;margin-bottom:-1.5rem!important}.my-lg-n5{margin-top:-2rem!important;margin-bottom:-2rem!important}.my-lg-n6{margin-top:-2.5rem!important;margin-bottom:-2.5rem!important}.mt-lg-n1{margin-top:-.25rem!important}.mt-lg-n2{margin-top:-.5rem!important}.mt-lg-n3{margin-top:-1rem!important}.mt-lg-n4{margin-top:-1.5rem!important}.mt-lg-n5{margin-top:-2rem!important}.mt-lg-n6{margin-top:-2.5rem!important}.me-lg-n1{margin-right:-.25rem!important}.me-lg-n2{margin-right:-.5rem!important}.me-lg-n3{margin-right:-1rem!important}.me-lg-n4{margin-right:-1.5rem!important}.me-lg-n5{margin-right:-2rem!important}.me-lg-n6{margin-right:-2.5rem!important}.mb-lg-n1{margin-bottom:-.25rem!important}.mb-lg-n2{margin-bottom:-.5rem!important}.mb-lg-n3{margin-bottom:-1rem!important}.mb-lg-n4{margin-bottom:-1.5rem!important}.mb-lg-n5{margin-bottom:-2rem!important}.mb-lg-n6{margin-bottom:-2.5rem!important}.ms-lg-n1{margin-left:-.25rem!important}.ms-lg-n2{margin-left:-.5rem!important}.ms-lg-n3{margin-left:-1rem!important}.ms-lg-n4{margin-left:-1.5rem!important}.ms-lg-n5{margin-left:-2rem!important}.ms-lg-n6{margin-left:-2.5rem!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:2rem!important}.p-lg-6{padding:2.5rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:2rem!important;padding-left:2rem!important}.px-lg-6{padding-right:2.5rem!important;padding-left:2.5rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:2rem!important;padding-bottom:2rem!important}.py-lg-6{padding-top:2.5rem!important;padding-bottom:2.5rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:2rem!important}.pt-lg-6{padding-top:2.5rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:2rem!important}.pe-lg-6{padding-right:2.5rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:2rem!important}.pb-lg-6{padding-bottom:2.5rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:2rem!important}.ps-lg-6{padding-left:2.5rem!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:2rem!important}.gap-lg-6{gap:2.5rem!important}.row-gap-lg-0{row-gap:0!important}.row-gap-lg-1{row-gap:.25rem!important}.row-gap-lg-2{row-gap:.5rem!important}.row-gap-lg-3{row-gap:1rem!important}.row-gap-lg-4{row-gap:1.5rem!important}.row-gap-lg-5{row-gap:2rem!important}.row-gap-lg-6{row-gap:2.5rem!important}.column-gap-lg-0{column-gap:0!important}.column-gap-lg-1{column-gap:.25rem!important}.column-gap-lg-2{column-gap:.5rem!important}.column-gap-lg-3{column-gap:1rem!important}.column-gap-lg-4{column-gap:1.5rem!important}.column-gap-lg-5{column-gap:2rem!important}.column-gap-lg-6{column-gap:2.5rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}.columns-lg-2{columns:2!important}.columns-lg-3{columns:3!important}.columns-lg-4{columns:4!important}}@media(min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.object-fit-xl-contain{object-fit:contain!important}.object-fit-xl-cover{object-fit:cover!important}.object-fit-xl-fill{object-fit:fill!important}.object-fit-xl-scale{object-fit:scale-down!important}.object-fit-xl-none{object-fit:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-inline-grid{display:inline-grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:2rem!important}.m-xl-6{margin:2.5rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:2rem!important;margin-left:2rem!important}.mx-xl-6{margin-right:2.5rem!important;margin-left:2.5rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:2rem!important;margin-bottom:2rem!important}.my-xl-6{margin-top:2.5rem!important;margin-bottom:2.5rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:2rem!important}.mt-xl-6{margin-top:2.5rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:2rem!important}.me-xl-6{margin-right:2.5rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:2rem!important}.mb-xl-6{margin-bottom:2.5rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:2rem!important}.ms-xl-6{margin-left:2.5rem!important}.ms-xl-auto{margin-left:auto!important}.m-xl-n1{margin:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.m-xl-n3{margin:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.m-xl-n5{margin:-2rem!important}.m-xl-n6{margin:-2.5rem!important}.mx-xl-n1{margin-right:-.25rem!important;margin-left:-.25rem!important}.mx-xl-n2{margin-right:-.5rem!important;margin-left:-.5rem!important}.mx-xl-n3{margin-right:-1rem!important;margin-left:-1rem!important}.mx-xl-n4{margin-right:-1.5rem!important;margin-left:-1.5rem!important}.mx-xl-n5{margin-right:-2rem!important;margin-left:-2rem!important}.mx-xl-n6{margin-right:-2.5rem!important;margin-left:-2.5rem!important}.my-xl-n1{margin-top:-.25rem!important;margin-bottom:-.25rem!important}.my-xl-n2{margin-top:-.5rem!important;margin-bottom:-.5rem!important}.my-xl-n3{margin-top:-1rem!important;margin-bottom:-1rem!important}.my-xl-n4{margin-top:-1.5rem!important;margin-bottom:-1.5rem!important}.my-xl-n5{margin-top:-2rem!important;margin-bottom:-2rem!important}.my-xl-n6{margin-top:-2.5rem!important;margin-bottom:-2.5rem!important}.mt-xl-n1{margin-top:-.25rem!important}.mt-xl-n2{margin-top:-.5rem!important}.mt-xl-n3{margin-top:-1rem!important}.mt-xl-n4{margin-top:-1.5rem!important}.mt-xl-n5{margin-top:-2rem!important}.mt-xl-n6{margin-top:-2.5rem!important}.me-xl-n1{margin-right:-.25rem!important}.me-xl-n2{margin-right:-.5rem!important}.me-xl-n3{margin-right:-1rem!important}.me-xl-n4{margin-right:-1.5rem!important}.me-xl-n5{margin-right:-2rem!important}.me-xl-n6{margin-right:-2.5rem!important}.mb-xl-n1{margin-bottom:-.25rem!important}.mb-xl-n2{margin-bottom:-.5rem!important}.mb-xl-n3{margin-bottom:-1rem!important}.mb-xl-n4{margin-bottom:-1.5rem!important}.mb-xl-n5{margin-bottom:-2rem!important}.mb-xl-n6{margin-bottom:-2.5rem!important}.ms-xl-n1{margin-left:-.25rem!important}.ms-xl-n2{margin-left:-.5rem!important}.ms-xl-n3{margin-left:-1rem!important}.ms-xl-n4{margin-left:-1.5rem!important}.ms-xl-n5{margin-left:-2rem!important}.ms-xl-n6{margin-left:-2.5rem!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:2rem!important}.p-xl-6{padding:2.5rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:2rem!important;padding-left:2rem!important}.px-xl-6{padding-right:2.5rem!important;padding-left:2.5rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:2rem!important;padding-bottom:2rem!important}.py-xl-6{padding-top:2.5rem!important;padding-bottom:2.5rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:2rem!important}.pt-xl-6{padding-top:2.5rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:2rem!important}.pe-xl-6{padding-right:2.5rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:2rem!important}.pb-xl-6{padding-bottom:2.5rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:2rem!important}.ps-xl-6{padding-left:2.5rem!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:2rem!important}.gap-xl-6{gap:2.5rem!important}.row-gap-xl-0{row-gap:0!important}.row-gap-xl-1{row-gap:.25rem!important}.row-gap-xl-2{row-gap:.5rem!important}.row-gap-xl-3{row-gap:1rem!important}.row-gap-xl-4{row-gap:1.5rem!important}.row-gap-xl-5{row-gap:2rem!important}.row-gap-xl-6{row-gap:2.5rem!important}.column-gap-xl-0{column-gap:0!important}.column-gap-xl-1{column-gap:.25rem!important}.column-gap-xl-2{column-gap:.5rem!important}.column-gap-xl-3{column-gap:1rem!important}.column-gap-xl-4{column-gap:1.5rem!important}.column-gap-xl-5{column-gap:2rem!important}.column-gap-xl-6{column-gap:2.5rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}.columns-xl-2{columns:2!important}.columns-xl-3{columns:3!important}.columns-xl-4{columns:4!important}}@media(min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.object-fit-xxl-contain{object-fit:contain!important}.object-fit-xxl-cover{object-fit:cover!important}.object-fit-xxl-fill{object-fit:fill!important}.object-fit-xxl-scale{object-fit:scale-down!important}.object-fit-xxl-none{object-fit:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-inline-grid{display:inline-grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:2rem!important}.m-xxl-6{margin:2.5rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:2rem!important;margin-left:2rem!important}.mx-xxl-6{margin-right:2.5rem!important;margin-left:2.5rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:2rem!important;margin-bottom:2rem!important}.my-xxl-6{margin-top:2.5rem!important;margin-bottom:2.5rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:2rem!important}.mt-xxl-6{margin-top:2.5rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:2rem!important}.me-xxl-6{margin-right:2.5rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:2rem!important}.mb-xxl-6{margin-bottom:2.5rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:2rem!important}.ms-xxl-6{margin-left:2.5rem!important}.ms-xxl-auto{margin-left:auto!important}.m-xxl-n1{margin:-.25rem!important}.m-xxl-n2{margin:-.5rem!important}.m-xxl-n3{margin:-1rem!important}.m-xxl-n4{margin:-1.5rem!important}.m-xxl-n5{margin:-2rem!important}.m-xxl-n6{margin:-2.5rem!important}.mx-xxl-n1{margin-right:-.25rem!important;margin-left:-.25rem!important}.mx-xxl-n2{margin-right:-.5rem!important;margin-left:-.5rem!important}.mx-xxl-n3{margin-right:-1rem!important;margin-left:-1rem!important}.mx-xxl-n4{margin-right:-1.5rem!important;margin-left:-1.5rem!important}.mx-xxl-n5{margin-right:-2rem!important;margin-left:-2rem!important}.mx-xxl-n6{margin-right:-2.5rem!important;margin-left:-2.5rem!important}.my-xxl-n1{margin-top:-.25rem!important;margin-bottom:-.25rem!important}.my-xxl-n2{margin-top:-.5rem!important;margin-bottom:-.5rem!important}.my-xxl-n3{margin-top:-1rem!important;margin-bottom:-1rem!important}.my-xxl-n4{margin-top:-1.5rem!important;margin-bottom:-1.5rem!important}.my-xxl-n5{margin-top:-2rem!important;margin-bottom:-2rem!important}.my-xxl-n6{margin-top:-2.5rem!important;margin-bottom:-2.5rem!important}.mt-xxl-n1{margin-top:-.25rem!important}.mt-xxl-n2{margin-top:-.5rem!important}.mt-xxl-n3{margin-top:-1rem!important}.mt-xxl-n4{margin-top:-1.5rem!important}.mt-xxl-n5{margin-top:-2rem!important}.mt-xxl-n6{margin-top:-2.5rem!important}.me-xxl-n1{margin-right:-.25rem!important}.me-xxl-n2{margin-right:-.5rem!important}.me-xxl-n3{margin-right:-1rem!important}.me-xxl-n4{margin-right:-1.5rem!important}.me-xxl-n5{margin-right:-2rem!important}.me-xxl-n6{margin-right:-2.5rem!important}.mb-xxl-n1{margin-bottom:-.25rem!important}.mb-xxl-n2{margin-bottom:-.5rem!important}.mb-xxl-n3{margin-bottom:-1rem!important}.mb-xxl-n4{margin-bottom:-1.5rem!important}.mb-xxl-n5{margin-bottom:-2rem!important}.mb-xxl-n6{margin-bottom:-2.5rem!important}.ms-xxl-n1{margin-left:-.25rem!important}.ms-xxl-n2{margin-left:-.5rem!important}.ms-xxl-n3{margin-left:-1rem!important}.ms-xxl-n4{margin-left:-1.5rem!important}.ms-xxl-n5{margin-left:-2rem!important}.ms-xxl-n6{margin-left:-2.5rem!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:2rem!important}.p-xxl-6{padding:2.5rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:2rem!important;padding-left:2rem!important}.px-xxl-6{padding-right:2.5rem!important;padding-left:2.5rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:2rem!important;padding-bottom:2rem!important}.py-xxl-6{padding-top:2.5rem!important;padding-bottom:2.5rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:2rem!important}.pt-xxl-6{padding-top:2.5rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:2rem!important}.pe-xxl-6{padding-right:2.5rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:2rem!important}.pb-xxl-6{padding-bottom:2.5rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:2rem!important}.ps-xxl-6{padding-left:2.5rem!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:2rem!important}.gap-xxl-6{gap:2.5rem!important}.row-gap-xxl-0{row-gap:0!important}.row-gap-xxl-1{row-gap:.25rem!important}.row-gap-xxl-2{row-gap:.5rem!important}.row-gap-xxl-3{row-gap:1rem!important}.row-gap-xxl-4{row-gap:1.5rem!important}.row-gap-xxl-5{row-gap:2rem!important}.row-gap-xxl-6{row-gap:2.5rem!important}.column-gap-xxl-0{column-gap:0!important}.column-gap-xxl-1{column-gap:.25rem!important}.column-gap-xxl-2{column-gap:.5rem!important}.column-gap-xxl-3{column-gap:1rem!important}.column-gap-xxl-4{column-gap:1.5rem!important}.column-gap-xxl-5{column-gap:2rem!important}.column-gap-xxl-6{column-gap:2.5rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}.columns-xxl-2{columns:2!important}.columns-xxl-3{columns:3!important}.columns-xxl-4{columns:4!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-inline-grid{display:inline-grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}}:root,:host{--tblr-font-monospace: Roboto Mono;--tblr-font-sans-serif: Inter, system-ui, sans-serif;--tblr-font-serif: Georgia, Times New Roman, times, serif;--tblr-font-comic: Comic Sans MS, Comic Sans, Chalkboard SE, Comic Neue, sans-serif, cursive;--tblr-gray-50: #f9fafb;--tblr-gray-100: #f3f4f6;--tblr-gray-200: #e5e7eb;--tblr-gray-300: #d1d5db;--tblr-gray-400: #9ca3af;--tblr-gray-500: #6b7280;--tblr-gray-600: #4b5563;--tblr-gray-700: #374151;--tblr-gray-800: #1f2937;--tblr-gray-900: #111827;--tblr-gray-950: #030712;--tblr-white: #ffffff;--tblr-black: #000000;--tblr-brand: #00857D;--tblr-primary: #00857D;--tblr-primary-rgb: 0, 133, 125;--tblr-primary-fg: var(--tblr-light);--tblr-primary-darken: rgb(0, 119.7, 112.5);--tblr-primary-darken: color-mix(in oklab, var(--tblr-primary), transparent 20%);--tblr-primary-lt: rgb(229.5, 242.8, 242);--tblr-primary-lt: color-mix(in oklab, var(--tblr-primary) 10%, transparent);--tblr-primary-200: color-mix(in oklab, var(--tblr-primary) 20%, transparent);--tblr-primary-lt-rgb: 230, 243, 242;--tblr-secondary: #6b7280;--tblr-secondary-rgb: 107, 114, 128;--tblr-secondary-fg: var(--tblr-light);--tblr-secondary-darken: rgb(96.3, 102.6, 115.2);--tblr-secondary-darken: color-mix(in oklab, var(--tblr-secondary), transparent 20%);--tblr-secondary-lt: rgb(240.2, 240.9, 242.3);--tblr-secondary-lt: color-mix(in oklab, var(--tblr-secondary) 10%, transparent);--tblr-secondary-200: color-mix(in oklab, var(--tblr-secondary) 20%, transparent);--tblr-secondary-lt-rgb: 240, 241, 242;--tblr-success: #2fb344;--tblr-success-rgb: 47, 179, 68;--tblr-success-fg: var(--tblr-light);--tblr-success-darken: rgb(42.3, 161.1, 61.2);--tblr-success-darken: color-mix(in oklab, var(--tblr-success), transparent 20%);--tblr-success-lt: rgb(234.2, 247.4, 236.3);--tblr-success-lt: color-mix(in oklab, var(--tblr-success) 10%, transparent);--tblr-success-200: color-mix(in oklab, var(--tblr-success) 20%, transparent);--tblr-success-lt-rgb: 234, 247, 236;--tblr-info: #4299e1;--tblr-info-rgb: 66, 153, 225;--tblr-info-fg: var(--tblr-light);--tblr-info-darken: rgb(59.4, 137.7, 202.5);--tblr-info-darken: color-mix(in oklab, var(--tblr-info), transparent 20%);--tblr-info-lt: rgb(236.1, 244.8, 252);--tblr-info-lt: color-mix(in oklab, var(--tblr-info) 10%, transparent);--tblr-info-200: color-mix(in oklab, var(--tblr-info) 20%, transparent);--tblr-info-lt-rgb: 236, 245, 252;--tblr-warning: #f59f00;--tblr-warning-rgb: 245, 159, 0;--tblr-warning-fg: var(--tblr-light);--tblr-warning-darken: rgb(220.5, 143.1, 0);--tblr-warning-darken: color-mix(in oklab, var(--tblr-warning), transparent 20%);--tblr-warning-lt: rgb(254, 245.4, 229.5);--tblr-warning-lt: color-mix(in oklab, var(--tblr-warning) 10%, transparent);--tblr-warning-200: color-mix(in oklab, var(--tblr-warning) 20%, transparent);--tblr-warning-lt-rgb: 254, 245, 230;--tblr-danger: #d63939;--tblr-danger-rgb: 214, 57, 57;--tblr-danger-fg: var(--tblr-light);--tblr-danger-darken: rgb(192.6, 51.3, 51.3);--tblr-danger-darken: color-mix(in oklab, var(--tblr-danger), transparent 20%);--tblr-danger-lt: rgb(250.9, 235.2, 235.2);--tblr-danger-lt: color-mix(in oklab, var(--tblr-danger) 10%, transparent);--tblr-danger-200: color-mix(in oklab, var(--tblr-danger) 20%, transparent);--tblr-danger-lt-rgb: 251, 235, 235;--tblr-light: #f9fafb;--tblr-light-rgb: 249, 250, 251;--tblr-light-fg: var(--tblr-dark);--tblr-light-darken: rgb(224.1, 225, 225.9);--tblr-light-darken: color-mix(in oklab, var(--tblr-light), transparent 20%);--tblr-light-lt: rgb(254.4, 254.5, 254.6);--tblr-light-lt: color-mix(in oklab, var(--tblr-light) 10%, transparent);--tblr-light-200: color-mix(in oklab, var(--tblr-light) 20%, transparent);--tblr-light-lt-rgb: 254, 255, 255;--tblr-dark: #1f2937;--tblr-dark-rgb: 31, 41, 55;--tblr-dark-fg: var(--tblr-light);--tblr-dark-darken: rgb(27.9, 36.9, 49.5);--tblr-dark-darken: color-mix(in oklab, var(--tblr-dark), transparent 20%);--tblr-dark-lt: rgb(232.6, 233.6, 235);--tblr-dark-lt: color-mix(in oklab, var(--tblr-dark) 10%, transparent);--tblr-dark-200: color-mix(in oklab, var(--tblr-dark) 20%, transparent);--tblr-dark-lt-rgb: 233, 234, 235;--tblr-muted: #6b7280;--tblr-muted-rgb: 107, 114, 128;--tblr-muted-fg: var(--tblr-light);--tblr-muted-darken: rgb(96.3, 102.6, 115.2);--tblr-muted-darken: color-mix(in oklab, var(--tblr-muted), transparent 20%);--tblr-muted-lt: rgb(240.2, 240.9, 242.3);--tblr-muted-lt: color-mix(in oklab, var(--tblr-muted) 10%, transparent);--tblr-muted-200: color-mix(in oklab, var(--tblr-muted) 20%, transparent);--tblr-muted-lt-rgb: 240, 241, 242;--tblr-blue: #066fd1;--tblr-blue-rgb: 6, 111, 209;--tblr-blue-fg: var(--tblr-light);--tblr-blue-darken: rgb(5.4, 99.9, 188.1);--tblr-blue-darken: color-mix(in oklab, var(--tblr-blue), transparent 20%);--tblr-blue-lt: rgb(230.1, 240.6, 250.4);--tblr-blue-lt: color-mix(in oklab, var(--tblr-blue) 10%, transparent);--tblr-blue-200: color-mix(in oklab, var(--tblr-blue) 20%, transparent);--tblr-blue-lt-rgb: 230, 241, 250;--tblr-azure: #4299e1;--tblr-azure-rgb: 66, 153, 225;--tblr-azure-fg: var(--tblr-light);--tblr-azure-darken: rgb(59.4, 137.7, 202.5);--tblr-azure-darken: color-mix(in oklab, var(--tblr-azure), transparent 20%);--tblr-azure-lt: rgb(236.1, 244.8, 252);--tblr-azure-lt: color-mix(in oklab, var(--tblr-azure) 10%, transparent);--tblr-azure-200: color-mix(in oklab, var(--tblr-azure) 20%, transparent);--tblr-azure-lt-rgb: 236, 245, 252;--tblr-indigo: #4263eb;--tblr-indigo-rgb: 66, 99, 235;--tblr-indigo-fg: var(--tblr-light);--tblr-indigo-darken: rgb(59.4, 89.1, 211.5);--tblr-indigo-darken: color-mix(in oklab, var(--tblr-indigo), transparent 20%);--tblr-indigo-lt: rgb(236.1, 239.4, 253);--tblr-indigo-lt: color-mix(in oklab, var(--tblr-indigo) 10%, transparent);--tblr-indigo-200: color-mix(in oklab, var(--tblr-indigo) 20%, transparent);--tblr-indigo-lt-rgb: 236, 239, 253;--tblr-purple: #ae3ec9;--tblr-purple-rgb: 174, 62, 201;--tblr-purple-fg: var(--tblr-light);--tblr-purple-darken: rgb(156.6, 55.8, 180.9);--tblr-purple-darken: color-mix(in oklab, var(--tblr-purple), transparent 20%);--tblr-purple-lt: rgb(246.9, 235.7, 249.6);--tblr-purple-lt: color-mix(in oklab, var(--tblr-purple) 10%, transparent);--tblr-purple-200: color-mix(in oklab, var(--tblr-purple) 20%, transparent);--tblr-purple-lt-rgb: 247, 236, 250;--tblr-pink: #d6336c;--tblr-pink-rgb: 214, 51, 108;--tblr-pink-fg: var(--tblr-light);--tblr-pink-darken: rgb(192.6, 45.9, 97.2);--tblr-pink-darken: color-mix(in oklab, var(--tblr-pink), transparent 20%);--tblr-pink-lt: rgb(250.9, 234.6, 240.3);--tblr-pink-lt: color-mix(in oklab, var(--tblr-pink) 10%, transparent);--tblr-pink-200: color-mix(in oklab, var(--tblr-pink) 20%, transparent);--tblr-pink-lt-rgb: 251, 235, 240;--tblr-red: #d63939;--tblr-red-rgb: 214, 57, 57;--tblr-red-fg: var(--tblr-light);--tblr-red-darken: rgb(192.6, 51.3, 51.3);--tblr-red-darken: color-mix(in oklab, var(--tblr-red), transparent 20%);--tblr-red-lt: rgb(250.9, 235.2, 235.2);--tblr-red-lt: color-mix(in oklab, var(--tblr-red) 10%, transparent);--tblr-red-200: color-mix(in oklab, var(--tblr-red) 20%, transparent);--tblr-red-lt-rgb: 251, 235, 235;--tblr-orange: #f76707;--tblr-orange-rgb: 247, 103, 7;--tblr-orange-fg: var(--tblr-light);--tblr-orange-darken: rgb(222.3, 92.7, 6.3);--tblr-orange-darken: color-mix(in oklab, var(--tblr-orange), transparent 20%);--tblr-orange-lt: rgb(254.2, 239.8, 230.2);--tblr-orange-lt: color-mix(in oklab, var(--tblr-orange) 10%, transparent);--tblr-orange-200: color-mix(in oklab, var(--tblr-orange) 20%, transparent);--tblr-orange-lt-rgb: 254, 240, 230;--tblr-yellow: #f59f00;--tblr-yellow-rgb: 245, 159, 0;--tblr-yellow-fg: var(--tblr-light);--tblr-yellow-darken: rgb(220.5, 143.1, 0);--tblr-yellow-darken: color-mix(in oklab, var(--tblr-yellow), transparent 20%);--tblr-yellow-lt: rgb(254, 245.4, 229.5);--tblr-yellow-lt: color-mix(in oklab, var(--tblr-yellow) 10%, transparent);--tblr-yellow-200: color-mix(in oklab, var(--tblr-yellow) 20%, transparent);--tblr-yellow-lt-rgb: 254, 245, 230;--tblr-lime: #74b816;--tblr-lime-rgb: 116, 184, 22;--tblr-lime-fg: var(--tblr-light);--tblr-lime-darken: rgb(104.4, 165.6, 19.8);--tblr-lime-darken: color-mix(in oklab, var(--tblr-lime), transparent 20%);--tblr-lime-lt: rgb(241.1, 247.9, 231.7);--tblr-lime-lt: color-mix(in oklab, var(--tblr-lime) 10%, transparent);--tblr-lime-200: color-mix(in oklab, var(--tblr-lime) 20%, transparent);--tblr-lime-lt-rgb: 241, 248, 232;--tblr-green: #2fb344;--tblr-green-rgb: 47, 179, 68;--tblr-green-fg: var(--tblr-light);--tblr-green-darken: rgb(42.3, 161.1, 61.2);--tblr-green-darken: color-mix(in oklab, var(--tblr-green), transparent 20%);--tblr-green-lt: rgb(234.2, 247.4, 236.3);--tblr-green-lt: color-mix(in oklab, var(--tblr-green) 10%, transparent);--tblr-green-200: color-mix(in oklab, var(--tblr-green) 20%, transparent);--tblr-green-lt-rgb: 234, 247, 236;--tblr-teal: #0ca678;--tblr-teal-rgb: 12, 166, 120;--tblr-teal-fg: var(--tblr-light);--tblr-teal-darken: rgb(10.8, 149.4, 108);--tblr-teal-darken: color-mix(in oklab, var(--tblr-teal), transparent 20%);--tblr-teal-lt: rgb(230.7, 246.1, 241.5);--tblr-teal-lt: color-mix(in oklab, var(--tblr-teal) 10%, transparent);--tblr-teal-200: color-mix(in oklab, var(--tblr-teal) 20%, transparent);--tblr-teal-lt-rgb: 231, 246, 242;--tblr-cyan: #17a2b8;--tblr-cyan-rgb: 23, 162, 184;--tblr-cyan-fg: var(--tblr-light);--tblr-cyan-darken: rgb(20.7, 145.8, 165.6);--tblr-cyan-darken: color-mix(in oklab, var(--tblr-cyan), transparent 20%);--tblr-cyan-lt: rgb(231.8, 245.7, 247.9);--tblr-cyan-lt: color-mix(in oklab, var(--tblr-cyan) 10%, transparent);--tblr-cyan-200: color-mix(in oklab, var(--tblr-cyan) 20%, transparent);--tblr-cyan-lt-rgb: 232, 246, 248;--tblr-x: #000000;--tblr-x-rgb: 0, 0, 0;--tblr-x-fg: var(--tblr-light);--tblr-x-darken: black;--tblr-x-darken: color-mix(in oklab, var(--tblr-x), transparent 20%);--tblr-x-lt: rgb(229.5, 229.5, 229.5);--tblr-x-lt: color-mix(in oklab, var(--tblr-x) 10%, transparent);--tblr-x-200: color-mix(in oklab, var(--tblr-x) 20%, transparent);--tblr-x-lt-rgb: 230, 230, 230;--tblr-facebook: #1877f2;--tblr-facebook-rgb: 24, 119, 242;--tblr-facebook-fg: var(--tblr-light);--tblr-facebook-darken: rgb(21.6, 107.1, 217.8);--tblr-facebook-darken: color-mix(in oklab, var(--tblr-facebook), transparent 20%);--tblr-facebook-lt: rgb(231.9, 241.4, 253.7);--tblr-facebook-lt: color-mix(in oklab, var(--tblr-facebook) 10%, transparent);--tblr-facebook-200: color-mix(in oklab, var(--tblr-facebook) 20%, transparent);--tblr-facebook-lt-rgb: 232, 241, 254;--tblr-twitter: #1da1f2;--tblr-twitter-rgb: 29, 161, 242;--tblr-twitter-fg: var(--tblr-light);--tblr-twitter-darken: rgb(26.1, 144.9, 217.8);--tblr-twitter-darken: color-mix(in oklab, var(--tblr-twitter), transparent 20%);--tblr-twitter-lt: rgb(232.4, 245.6, 253.7);--tblr-twitter-lt: color-mix(in oklab, var(--tblr-twitter) 10%, transparent);--tblr-twitter-200: color-mix(in oklab, var(--tblr-twitter) 20%, transparent);--tblr-twitter-lt-rgb: 232, 246, 254;--tblr-linkedin: #0a66c2;--tblr-linkedin-rgb: 10, 102, 194;--tblr-linkedin-fg: var(--tblr-light);--tblr-linkedin-darken: rgb(9, 91.8, 174.6);--tblr-linkedin-darken: color-mix(in oklab, var(--tblr-linkedin), transparent 20%);--tblr-linkedin-lt: rgb(230.5, 239.7, 248.9);--tblr-linkedin-lt: color-mix(in oklab, var(--tblr-linkedin) 10%, transparent);--tblr-linkedin-200: color-mix(in oklab, var(--tblr-linkedin) 20%, transparent);--tblr-linkedin-lt-rgb: 231, 240, 249;--tblr-google: #dc4e41;--tblr-google-rgb: 220, 78, 65;--tblr-google-fg: var(--tblr-light);--tblr-google-darken: rgb(198, 70.2, 58.5);--tblr-google-darken: color-mix(in oklab, var(--tblr-google), transparent 20%);--tblr-google-lt: rgb(251.5, 237.3, 236);--tblr-google-lt: color-mix(in oklab, var(--tblr-google) 10%, transparent);--tblr-google-200: color-mix(in oklab, var(--tblr-google) 20%, transparent);--tblr-google-lt-rgb: 252, 237, 236;--tblr-youtube: #ff0000;--tblr-youtube-rgb: 255, 0, 0;--tblr-youtube-fg: var(--tblr-light);--tblr-youtube-darken: rgb(229.5, 0, 0);--tblr-youtube-darken: color-mix(in oklab, var(--tblr-youtube), transparent 20%);--tblr-youtube-lt: rgb(255, 229.5, 229.5);--tblr-youtube-lt: color-mix(in oklab, var(--tblr-youtube) 10%, transparent);--tblr-youtube-200: color-mix(in oklab, var(--tblr-youtube) 20%, transparent);--tblr-youtube-lt-rgb: 255, 230, 230;--tblr-vimeo: #1ab7ea;--tblr-vimeo-rgb: 26, 183, 234;--tblr-vimeo-fg: var(--tblr-light);--tblr-vimeo-darken: rgb(23.4, 164.7, 210.6);--tblr-vimeo-darken: color-mix(in oklab, var(--tblr-vimeo), transparent 20%);--tblr-vimeo-lt: rgb(232.1, 247.8, 252.9);--tblr-vimeo-lt: color-mix(in oklab, var(--tblr-vimeo) 10%, transparent);--tblr-vimeo-200: color-mix(in oklab, var(--tblr-vimeo) 20%, transparent);--tblr-vimeo-lt-rgb: 232, 248, 253;--tblr-dribbble: #ea4c89;--tblr-dribbble-rgb: 234, 76, 137;--tblr-dribbble-fg: var(--tblr-light);--tblr-dribbble-darken: rgb(210.6, 68.4, 123.3);--tblr-dribbble-darken: color-mix(in oklab, var(--tblr-dribbble), transparent 20%);--tblr-dribbble-lt: rgb(252.9, 237.1, 243.2);--tblr-dribbble-lt: color-mix(in oklab, var(--tblr-dribbble) 10%, transparent);--tblr-dribbble-200: color-mix(in oklab, var(--tblr-dribbble) 20%, transparent);--tblr-dribbble-lt-rgb: 253, 237, 243;--tblr-github: #181717;--tblr-github-rgb: 24, 23, 23;--tblr-github-fg: var(--tblr-light);--tblr-github-darken: rgb(21.6, 20.7, 20.7);--tblr-github-darken: color-mix(in oklab, var(--tblr-github), transparent 20%);--tblr-github-lt: rgb(231.9, 231.8, 231.8);--tblr-github-lt: color-mix(in oklab, var(--tblr-github) 10%, transparent);--tblr-github-200: color-mix(in oklab, var(--tblr-github) 20%, transparent);--tblr-github-lt-rgb: 232, 232, 232;--tblr-instagram: #e4405f;--tblr-instagram-rgb: 228, 64, 95;--tblr-instagram-fg: var(--tblr-light);--tblr-instagram-darken: rgb(205.2, 57.6, 85.5);--tblr-instagram-darken: color-mix(in oklab, var(--tblr-instagram), transparent 20%);--tblr-instagram-lt: rgb(252.3, 235.9, 239);--tblr-instagram-lt: color-mix(in oklab, var(--tblr-instagram) 10%, transparent);--tblr-instagram-200: color-mix(in oklab, var(--tblr-instagram) 20%, transparent);--tblr-instagram-lt-rgb: 252, 236, 239;--tblr-pinterest: #bd081c;--tblr-pinterest-rgb: 189, 8, 28;--tblr-pinterest-fg: var(--tblr-light);--tblr-pinterest-darken: rgb(170.1, 7.2, 25.2);--tblr-pinterest-darken: color-mix(in oklab, var(--tblr-pinterest), transparent 20%);--tblr-pinterest-lt: rgb(248.4, 230.3, 232.3);--tblr-pinterest-lt: color-mix(in oklab, var(--tblr-pinterest) 10%, transparent);--tblr-pinterest-200: color-mix(in oklab, var(--tblr-pinterest) 20%, transparent);--tblr-pinterest-lt-rgb: 248, 230, 232;--tblr-vk: #6383a8;--tblr-vk-rgb: 99, 131, 168;--tblr-vk-fg: var(--tblr-light);--tblr-vk-darken: rgb(89.1, 117.9, 151.2);--tblr-vk-darken: color-mix(in oklab, var(--tblr-vk), transparent 20%);--tblr-vk-lt: rgb(239.4, 242.6, 246.3);--tblr-vk-lt: color-mix(in oklab, var(--tblr-vk) 10%, transparent);--tblr-vk-200: color-mix(in oklab, var(--tblr-vk) 20%, transparent);--tblr-vk-lt-rgb: 239, 243, 246;--tblr-rss: #ffa500;--tblr-rss-rgb: 255, 165, 0;--tblr-rss-fg: var(--tblr-light);--tblr-rss-darken: rgb(229.5, 148.5, 0);--tblr-rss-darken: color-mix(in oklab, var(--tblr-rss), transparent 20%);--tblr-rss-lt: rgb(255, 246, 229.5);--tblr-rss-lt: color-mix(in oklab, var(--tblr-rss) 10%, transparent);--tblr-rss-200: color-mix(in oklab, var(--tblr-rss) 20%, transparent);--tblr-rss-lt-rgb: 255, 246, 230;--tblr-flickr: #0063dc;--tblr-flickr-rgb: 0, 99, 220;--tblr-flickr-fg: var(--tblr-light);--tblr-flickr-darken: rgb(0, 89.1, 198);--tblr-flickr-darken: color-mix(in oklab, var(--tblr-flickr), transparent 20%);--tblr-flickr-lt: rgb(229.5, 239.4, 251.5);--tblr-flickr-lt: color-mix(in oklab, var(--tblr-flickr) 10%, transparent);--tblr-flickr-200: color-mix(in oklab, var(--tblr-flickr) 20%, transparent);--tblr-flickr-lt-rgb: 230, 239, 252;--tblr-bitbucket: #0052cc;--tblr-bitbucket-rgb: 0, 82, 204;--tblr-bitbucket-fg: var(--tblr-light);--tblr-bitbucket-darken: rgb(0, 73.8, 183.6);--tblr-bitbucket-darken: color-mix(in oklab, var(--tblr-bitbucket), transparent 20%);--tblr-bitbucket-lt: rgb(229.5, 237.7, 249.9);--tblr-bitbucket-lt: color-mix(in oklab, var(--tblr-bitbucket) 10%, transparent);--tblr-bitbucket-200: color-mix(in oklab, var(--tblr-bitbucket) 20%, transparent);--tblr-bitbucket-lt-rgb: 230, 238, 250;--tblr-tabler: #066fd1;--tblr-tabler-rgb: 6, 111, 209;--tblr-tabler-fg: var(--tblr-light);--tblr-tabler-darken: rgb(5.4, 99.9, 188.1);--tblr-tabler-darken: color-mix(in oklab, var(--tblr-tabler), transparent 20%);--tblr-tabler-lt: rgb(230.1, 240.6, 250.4);--tblr-tabler-lt: color-mix(in oklab, var(--tblr-tabler) 10%, transparent);--tblr-tabler-200: color-mix(in oklab, var(--tblr-tabler) 20%, transparent);--tblr-tabler-lt-rgb: 230, 241, 250;--tblr-gray-50-fg: var(--tblr-body-color);--tblr-gray-100-fg: var(--tblr-body-color);--tblr-gray-200-fg: var(--tblr-body-color);--tblr-gray-300-fg: var(--tblr-body-color);--tblr-gray-400-fg: var(--tblr-white);--tblr-gray-500-fg: var(--tblr-white);--tblr-gray-600-fg: var(--tblr-white);--tblr-gray-700-fg: var(--tblr-white);--tblr-gray-800-fg: var(--tblr-white);--tblr-gray-900-fg: var(--tblr-white);--tblr-gray-950-fg: var(--tblr-white);--tblr-spacer-0: 0;--tblr-spacer-1: .25rem;--tblr-spacer-2: .5rem;--tblr-spacer-3: 1rem;--tblr-spacer-4: 1.5rem;--tblr-spacer-5: 2rem;--tblr-spacer-6: 2.5rem;--tblr-font-weight-light: 300;--tblr-font-weight-normal: 400;--tblr-font-weight-medium: 500;--tblr-font-weight-bold: 600;--tblr-font-weight-black: 700;--tblr-font-weight-headings: var(--tblr-font-weight-bold);--tblr-font-size-h1: 1.5rem;--tblr-font-size-h2: 1.25rem;--tblr-font-size-h3: 1rem;--tblr-font-size-h4: .875rem;--tblr-font-size-h5: .75rem;--tblr-font-size-h6: .625rem;--tblr-line-height-h1: 2rem;--tblr-line-height-h2: 1.75rem;--tblr-line-height-h3: 1.5rem;--tblr-line-height-h4: 1.25rem;--tblr-line-height-h5: 1rem;--tblr-line-height-h6: 1rem;--tblr-shadow: rgba(var(--tblr-body-color-rgb), .04) 0 2px 4px 0;--tblr-shadow-border: inset 0 0 0 1px var(--tblr-border-color-translucent);--tblr-shadow-transparent: 0 0 0 0 transparent;--tblr-shadow-input: 0 1px 1px rgba(var(--tblr-body-color-rgb), .06);--tblr-shadow-card: 0 0 4px rgba(var(--tblr-body-color-rgb), .04);--tblr-shadow-card-hover: rgba(var(--tblr-body-color-rgb), .16) 0 2px 16px 0;--tblr-shadow-dropdown: 0 16px 24px 2px rgba(0, 0, 0, .07), 0 6px 30px 5px rgba(0, 0, 0, .06), 0 8px 10px -5px rgba(0, 0, 0, .1);--tblr-border-radius-scale: 1;--tblr-border-radius-0: calc(0 * var(--tblr-border-radius-scale, 1));--tblr-border-radius-sm: calc(4px * var(--tblr-border-radius-scale, 1));--tblr-border-radius-md: calc(6px * var(--tblr-border-radius-scale, 1));--tblr-border-radius-lg: calc(8px * var(--tblr-border-radius-scale, 1));--tblr-border-radius-pill: calc(100rem * var(--tblr-border-radius-scale, 1));--tblr-border-radius: var(--tblr-border-radius-md);--tblr-backdrop-opacity: 24%;--tblr-backdrop-bg: var(--tblr-bg-surface-dark);--tblr-backdrop-bg-dark: color-mix(in srgb, var(--tblr-color-dark), transparent var(--tblr-backdrop-opacity));--tblr-backdrop-bg-light: color-mix(in srgb, var(--tblr-color-light), transparent var(--tblr-backdrop-opacity));--tblr-backdrop-blur: 4px;--tblr-backdrop-filter: blur(var(--tblr-backdrop-blur))}:root,:host{font-size:16px;height:100%}@media(min-width:992px){:root,:host{margin-left:calc(100vw - 100%);margin-right:0}}:root,:host,[data-bs-theme=light]{color-scheme:light;--tblr-spacer: var(--tblr-spacer-2);--tblr-bg-surface: var(--tblr-bg-surface-primary);--tblr-bg-surface-primary: var(--tblr-white);--tblr-bg-surface-secondary: var(--tblr-gray-50);--tblr-bg-surface-tertiary: var(--tblr-gray-50);--tblr-bg-surface-dark: var(--tblr-gray-900);--tblr-bg-surface-inverted: var(--tblr-gray-900);--tblr-bg-forms: var(--tblr-bg-surface);--tblr-text-inverted: var(--tblr-gray-100);--tblr-body-color: var(--tblr-gray-700);--tblr-body-bg: var(--tblr-bg-surface-secondary);--tblr-link-color: var(--tblr-primary);--tblr-link-hover-color: color-mix(in srgb, var(--tblr-primary), #000 20%);--tblr-secondary: var(--tblr-gray-500);--tblr-tertiary: var(--tblr-gray-400);--tblr-border-color: #e5e7eb;--tblr-border-color-translucent: rgba(4, 32, 69, .1);--tblr-border-dark-color: #9ca3af;--tblr-border-dark-color-translucent: rgba(4, 32, 69, .27);--tblr-border-active-color: rgb(169.16, 173.22, 181.34);--tblr-icon-color: var(--tblr-gray-400);--tblr-active-bg: rgba(var(--tblr-primary-rgb), .04);--tblr-disabled-bg: var(--tblr-bg-surface-secondary);--tblr-disabled-color: color-mix(in srgb, var(--tblr-body-color) 40%, transparent);--tblr-code-color: light-dark(var(--tblr-gray-600), var(--tblr-gray-400));--tblr-code-bg: light-dark(var(--tblr-gray-100), var(--tblr-gray-900));--tblr-dark-mode-border-color: rgb(45.7069767442, 60.4511627907, 81.0930232558);--tblr-dark-mode-border-color-translucent: rgba(72, 110, 149, .14);--tblr-dark-mode-border-active-color: rgb(53.0604651163, 70.176744186, 94.1395348837);--tblr-dark-mode-border-dark-color: rgb(38.3534883721, 50.7255813953, 68.0465116279);--tblr-page-padding: var(--tblr-spacer-3);--tblr-page-padding-y: var(--tblr-spacer-4)}@media(max-width:991.98px){:root,:host,[data-bs-theme=light]{--tblr-page-padding: var(--tblr-spacer-2)}}@keyframes pulse{0%{transform:scale(1)}14%{transform:scale(1.25)}28%{transform:scale(1)}42%{transform:scale(1.25)}70%{transform:scale(1)}}@keyframes tada{0%{transform:scaleZ(1)}10%,5%{transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-5deg)}15%,25%,35%,45%{transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,5deg)}20%,30%,40%{transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-5deg)}50%{transform:scaleZ(1)}}@keyframes rotate-360{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes blink{0%{opacity:0}50%{opacity:1}to{opacity:0}}@keyframes shake{0%{transform:scaleX(1)}20%{transform:scale3d(.9,.9,.9) rotate(-5deg)}50%,70%,90%{transform:scale3d(1.25,1.25,1.25) rotate(5deg)}60%,80%{transform:scale3d(1.25,1.25,1.25) rotate(-5deg)}to{transform:scaleX(1)}}body{letter-spacing:0;touch-action:manipulation;text-rendering:optimizeLegibility;font-feature-settings:"liga" 0,"cv03","cv04","cv11";position:relative;min-height:100%;height:100%;padding:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media print{body{background:transparent}}*{scrollbar-color:color-mix(in srgb,var(--tblr-scrollbar-color, var(--tblr-body-color)) 20%,transparent) transparent}*::-webkit-scrollbar{width:1rem;height:1rem;transition:background .3s}@media(prefers-reduced-motion:reduce){*::-webkit-scrollbar{transition:none}}*::-webkit-scrollbar-thumb{border-radius:1rem;border:5px solid transparent;box-shadow:inset 0 0 0 1rem color-mix(in srgb,var(--tblr-scrollbar-color, var(--tblr-body-color)) 20%,transparent)}*::-webkit-scrollbar-track{background:transparent}*:hover::-webkit-scrollbar-thumb{box-shadow:inset 0 0 0 1rem color-mix(in srgb,var(--tblr-scrollbar-color, var(--tblr-body-color)) 40%,transparent)}*::-webkit-scrollbar-corner{background:transparent}.layout-fluid .container,.layout-fluid [class^=container-],.layout-fluid [class*=" container-"]{max-width:100%}.layout-boxed{--tblr-theme-boxed-border-radius: 0;--tblr-theme-boxed-width: 1320px}@media(min-width:768px){.layout-boxed{background:#1f2937 linear-gradient(to right,rgba(255,255,255,.1),transparent) fixed;padding:1rem;--tblr-theme-boxed-border-radius: 6px}}.layout-boxed .page{margin:0 auto;max-width:var(--tblr-theme-boxed-width);border-radius:var(--tblr-theme-boxed-border-radius);color:var(--tblr-body-color)}@media(min-width:768px){.layout-boxed .page{border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);background:var(--tblr-body-bg)}}.layout-boxed .page>.navbar:first-child{border-top-left-radius:var(--tblr-theme-boxed-border-radius);border-top-right-radius:var(--tblr-theme-boxed-border-radius)}.navbar{--tblr-navbar-bg: var(--tblr-bg-surface);--tblr-navbar-border-width: var(--tblr-border-width);--tblr-navbar-active-border-color: #00857D;--tblr-navbar-active-bg: rgba(0, 0, 0, .2);--tblr-navbar-border-color: var(--tblr-border-color);--tblr-navbar-hover-color: var(--tblr-body-color);align-items:stretch;min-height:3.5rem;box-shadow:inset 0 calc(-1 * var(--tblr-navbar-border-width)) 0 0 var(--tblr-navbar-border-color);background:var(--tblr-navbar-bg);color:var(--tblr-navbar-color)}.navbar-collapse .navbar{flex-grow:1}.navbar.collapsing{min-height:0}.navbar .dropdown-menu{position:absolute;z-index:1030}.navbar .navbar-nav{min-height:3rem}.navbar .navbar-nav .nav-link{position:relative;min-width:2.5rem;min-height:2.5rem;justify-content:center;border-radius:var(--tblr-border-radius)}.navbar .navbar-nav .nav-link .badge{position:absolute;top:.375rem;right:.375rem;transform:translate(50%,-50%)}@media(max-width:575.98px){.navbar-expand-sm .navbar-collapse{flex-direction:column}.navbar-expand-sm .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-expand-sm .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-expand-sm .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-expand-sm .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-expand-sm .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-item.disabled{color:var(--tblr-disabled-color);pointer-events:none;background-color:transparent}.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-expand-sm .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-expand-sm .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media(min-width:576px){.navbar-expand-sm .navbar-collapse{width:auto;flex:1 1 auto}.navbar-expand-sm .nav-item.active{position:relative}.navbar-expand-sm .nav-item.active .nav-link{color:var(--tblr-navbar-active-color)}.navbar-expand-sm .nav-item.active:after{content:"";position:absolute;left:0;right:0;bottom:-.25rem;border:0 var(--tblr-border-style) var(--tblr-navbar-active-border-color);border-bottom-width:2px}.navbar-expand-sm.navbar-vertical{box-shadow:inset calc(-1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-sm.navbar-vertical.navbar-right,.navbar-expand-sm.navbar-vertical.navbar-end{box-shadow:inset calc(1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-sm.navbar-vertical~.navbar,.navbar-expand-sm.navbar-vertical~.page-wrapper{margin-left:18rem}.navbar-expand-sm.navbar-vertical.navbar-right~.navbar,.navbar-expand-sm.navbar-vertical.navbar-right~.page-wrapper,.navbar-expand-sm.navbar-vertical.navbar-end~.navbar,.navbar-expand-sm.navbar-vertical.navbar-end~.page-wrapper{margin-left:0;margin-right:18rem}}@media(max-width:767.98px){.navbar-expand-md .navbar-collapse{flex-direction:column}.navbar-expand-md .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-expand-md .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-expand-md .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-expand-md .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-expand-md .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-item.disabled{color:var(--tblr-disabled-color);pointer-events:none;background-color:transparent}.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-expand-md .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-expand-md .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media(min-width:768px){.navbar-expand-md .navbar-collapse{width:auto;flex:1 1 auto}.navbar-expand-md .nav-item.active{position:relative}.navbar-expand-md .nav-item.active .nav-link{color:var(--tblr-navbar-active-color)}.navbar-expand-md .nav-item.active:after{content:"";position:absolute;left:0;right:0;bottom:-.25rem;border:0 var(--tblr-border-style) var(--tblr-navbar-active-border-color);border-bottom-width:2px}.navbar-expand-md.navbar-vertical{box-shadow:inset calc(-1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-md.navbar-vertical.navbar-right,.navbar-expand-md.navbar-vertical.navbar-end{box-shadow:inset calc(1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-md.navbar-vertical~.navbar,.navbar-expand-md.navbar-vertical~.page-wrapper{margin-left:18rem}.navbar-expand-md.navbar-vertical.navbar-right~.navbar,.navbar-expand-md.navbar-vertical.navbar-right~.page-wrapper,.navbar-expand-md.navbar-vertical.navbar-end~.navbar,.navbar-expand-md.navbar-vertical.navbar-end~.page-wrapper{margin-left:0;margin-right:18rem}}@media(max-width:991.98px){.navbar-expand-lg .navbar-collapse{flex-direction:column}.navbar-expand-lg .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-expand-lg .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-expand-lg .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-expand-lg .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-expand-lg .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item.disabled{color:var(--tblr-disabled-color);pointer-events:none;background-color:transparent}.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-expand-lg .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-expand-lg .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media(min-width:992px){.navbar-expand-lg .navbar-collapse{width:auto;flex:1 1 auto}.navbar-expand-lg .nav-item.active{position:relative}.navbar-expand-lg .nav-item.active .nav-link{color:var(--tblr-navbar-active-color)}.navbar-expand-lg .nav-item.active:after{content:"";position:absolute;left:0;right:0;bottom:-.25rem;border:0 var(--tblr-border-style) var(--tblr-navbar-active-border-color);border-bottom-width:2px}.navbar-expand-lg.navbar-vertical{box-shadow:inset calc(-1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-lg.navbar-vertical.navbar-right,.navbar-expand-lg.navbar-vertical.navbar-end{box-shadow:inset calc(1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-lg.navbar-vertical~.navbar,.navbar-expand-lg.navbar-vertical~.page-wrapper{margin-left:18rem}.navbar-expand-lg.navbar-vertical.navbar-right~.navbar,.navbar-expand-lg.navbar-vertical.navbar-right~.page-wrapper,.navbar-expand-lg.navbar-vertical.navbar-end~.navbar,.navbar-expand-lg.navbar-vertical.navbar-end~.page-wrapper{margin-left:0;margin-right:18rem}}@media(max-width:1199.98px){.navbar-expand-xl .navbar-collapse{flex-direction:column}.navbar-expand-xl .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-expand-xl .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-expand-xl .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-expand-xl .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-expand-xl .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-item.disabled{color:var(--tblr-disabled-color);pointer-events:none;background-color:transparent}.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-expand-xl .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-expand-xl .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media(min-width:1200px){.navbar-expand-xl .navbar-collapse{width:auto;flex:1 1 auto}.navbar-expand-xl .nav-item.active{position:relative}.navbar-expand-xl .nav-item.active .nav-link{color:var(--tblr-navbar-active-color)}.navbar-expand-xl .nav-item.active:after{content:"";position:absolute;left:0;right:0;bottom:-.25rem;border:0 var(--tblr-border-style) var(--tblr-navbar-active-border-color);border-bottom-width:2px}.navbar-expand-xl.navbar-vertical{box-shadow:inset calc(-1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-xl.navbar-vertical.navbar-right,.navbar-expand-xl.navbar-vertical.navbar-end{box-shadow:inset calc(1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-xl.navbar-vertical~.navbar,.navbar-expand-xl.navbar-vertical~.page-wrapper{margin-left:18rem}.navbar-expand-xl.navbar-vertical.navbar-right~.navbar,.navbar-expand-xl.navbar-vertical.navbar-right~.page-wrapper,.navbar-expand-xl.navbar-vertical.navbar-end~.navbar,.navbar-expand-xl.navbar-vertical.navbar-end~.page-wrapper{margin-left:0;margin-right:18rem}}@media(max-width:1399.98px){.navbar-expand-xxl .navbar-collapse{flex-direction:column}.navbar-expand-xxl .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-expand-xxl .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-expand-xxl .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-expand-xxl .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-expand-xxl .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-item.disabled{color:var(--tblr-disabled-color);pointer-events:none;background-color:transparent}.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-expand-xxl .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-expand-xxl .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media(min-width:1400px){.navbar-expand-xxl .navbar-collapse{width:auto;flex:1 1 auto}.navbar-expand-xxl .nav-item.active{position:relative}.navbar-expand-xxl .nav-item.active .nav-link{color:var(--tblr-navbar-active-color)}.navbar-expand-xxl .nav-item.active:after{content:"";position:absolute;left:0;right:0;bottom:-.25rem;border:0 var(--tblr-border-style) var(--tblr-navbar-active-border-color);border-bottom-width:2px}.navbar-expand-xxl.navbar-vertical{box-shadow:inset calc(-1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-xxl.navbar-vertical.navbar-right,.navbar-expand-xxl.navbar-vertical.navbar-end{box-shadow:inset calc(1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-xxl.navbar-vertical~.navbar,.navbar-expand-xxl.navbar-vertical~.page-wrapper{margin-left:18rem}.navbar-expand-xxl.navbar-vertical.navbar-right~.navbar,.navbar-expand-xxl.navbar-vertical.navbar-right~.page-wrapper,.navbar-expand-xxl.navbar-vertical.navbar-end~.navbar,.navbar-expand-xxl.navbar-vertical.navbar-end~.page-wrapper{margin-left:0;margin-right:18rem}}.navbar-expand .navbar-collapse{flex-direction:column}.navbar-expand .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-expand .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-expand .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-expand .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-expand .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-expand .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-expand .navbar-collapse .dropdown-menu .dropdown-item.disabled{color:var(--tblr-disabled-color);pointer-events:none;background-color:transparent}.navbar-expand .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-expand .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-expand .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-expand .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-expand .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-expand .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}.navbar-expand .navbar-collapse{width:auto;flex:1 1 auto}.navbar-expand .nav-item.active{position:relative}.navbar-expand .nav-item.active .nav-link{color:var(--tblr-navbar-active-color)}.navbar-expand .nav-item.active:after{content:"";position:absolute;left:0;right:0;bottom:-.25rem;border:0 var(--tblr-border-style) var(--tblr-navbar-active-border-color);border-bottom-width:2px}.navbar-expand.navbar-vertical{box-shadow:inset calc(-1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand.navbar-vertical.navbar-right,.navbar-expand.navbar-vertical.navbar-end{box-shadow:inset calc(1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand.navbar-vertical~.navbar,.navbar-expand.navbar-vertical~.page-wrapper{margin-left:18rem}.navbar-expand.navbar-vertical.navbar-right~.navbar,.navbar-expand.navbar-vertical.navbar-right~.page-wrapper,.navbar-expand.navbar-vertical.navbar-end~.navbar,.navbar-expand.navbar-vertical.navbar-end~.page-wrapper{margin-left:0;margin-right:18rem}.navbar-brand{display:inline-flex;align-items:center;font-weight:var(--tblr-font-weight-bold);margin:0;line-height:1;gap:.5rem}.navbar-brand-image{height:2rem;width:auto}.navbar-toggler{border:0;width:2rem;height:2rem;position:relative;display:flex;align-items:center;justify-content:center}.navbar-toggler-icon{height:2px;width:1.25em;background:currentColor;border-radius:10px;transition:top .2s .2s,bottom .2s .2s,transform .2s,opacity 0s .2s}@media(prefers-reduced-motion:reduce){.navbar-toggler-icon{transition:none}}.navbar-toggler-icon{position:relative}.navbar-toggler-icon:before,.navbar-toggler-icon:after{content:"";display:block;height:inherit;width:inherit;border-radius:inherit;background:inherit;position:absolute;left:0;transition:inherit}@media(prefers-reduced-motion:reduce){.navbar-toggler-icon:before,.navbar-toggler-icon:after{transition:none}}.navbar-toggler-icon:before{top:-.45em}.navbar-toggler-icon:after{bottom:-.45em}.navbar-toggler[aria-expanded=true] .navbar-toggler-icon{transform:rotate(45deg);transition:top .3s,bottom .3s,transform .3s .3s,opacity 0s .3s}@media(prefers-reduced-motion:reduce){.navbar-toggler[aria-expanded=true] .navbar-toggler-icon{transition:none}}.navbar-toggler[aria-expanded=true] .navbar-toggler-icon:before{top:0;transform:rotate(-90deg)}.navbar-toggler[aria-expanded=true] .navbar-toggler-icon:after{bottom:0;opacity:0}.navbar-transparent{--tblr-navbar-border-color: transparent !important;background:transparent!important}.navbar-nav{--tblr-nav-link-hover-bg: color-mix(in srgb, var(--tblr-nav-link-color) 4%, transparent);margin:0;padding:0;align-items:stretch}.navbar-nav .nav-item{display:flex;flex-direction:column;justify-content:center}.navbar-side{margin:0;display:flex;flex-direction:row;align-items:center;justify-content:space-around}@media(min-width:576px){.navbar-vertical.navbar-expand-sm{width:18rem;position:fixed;top:0;left:0;bottom:0;z-index:1030;align-items:flex-start;transition:transform .3s;overflow-y:scroll;padding:0}}@media(min-width:576px)and (prefers-reduced-motion:reduce){.navbar-vertical.navbar-expand-sm{transition:none}}@media(min-width:576px){.navbar-vertical.navbar-expand-sm.navbar-right,.navbar-vertical.navbar-expand-sm.navbar-end{left:auto;right:0}.navbar-vertical.navbar-expand-sm .navbar-brand{padding:.75rem 0;justify-content:center}.navbar-vertical.navbar-expand-sm .navbar-collapse{align-items:stretch}.navbar-vertical.navbar-expand-sm .navbar-nav{flex-direction:column;flex-grow:1;min-height:auto}.navbar-vertical.navbar-expand-sm .navbar-nav .nav-link{padding-top:.5rem;padding-bottom:.5rem}.navbar-vertical.navbar-expand-sm>[class^=container]{flex-direction:column;align-items:stretch;min-height:100%;justify-content:flex-start;padding:0}.navbar-vertical.navbar-expand-sm~.page{padding-left:18rem}.navbar-vertical.navbar-expand-sm~.page [class^=container]{padding-left:1.5rem;padding-right:1.5rem}.navbar-vertical.navbar-expand-sm.navbar-right~.page,.navbar-vertical.navbar-expand-sm.navbar-end~.page{padding-left:0;padding-right:18rem}.navbar-vertical.navbar-expand-sm .navbar-collapse{flex-direction:column}.navbar-vertical.navbar-expand-sm .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-vertical.navbar-expand-sm .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-vertical.navbar-expand-sm .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-item.disabled{color:var(--tblr-disabled-color);pointer-events:none;background-color:transparent}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-vertical.navbar-expand-sm .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media(min-width:768px){.navbar-vertical.navbar-expand-md{width:18rem;position:fixed;top:0;left:0;bottom:0;z-index:1030;align-items:flex-start;transition:transform .3s;overflow-y:scroll;padding:0}}@media(min-width:768px)and (prefers-reduced-motion:reduce){.navbar-vertical.navbar-expand-md{transition:none}}@media(min-width:768px){.navbar-vertical.navbar-expand-md.navbar-right,.navbar-vertical.navbar-expand-md.navbar-end{left:auto;right:0}.navbar-vertical.navbar-expand-md .navbar-brand{padding:.75rem 0;justify-content:center}.navbar-vertical.navbar-expand-md .navbar-collapse{align-items:stretch}.navbar-vertical.navbar-expand-md .navbar-nav{flex-direction:column;flex-grow:1;min-height:auto}.navbar-vertical.navbar-expand-md .navbar-nav .nav-link{padding-top:.5rem;padding-bottom:.5rem}.navbar-vertical.navbar-expand-md>[class^=container]{flex-direction:column;align-items:stretch;min-height:100%;justify-content:flex-start;padding:0}.navbar-vertical.navbar-expand-md~.page{padding-left:18rem}.navbar-vertical.navbar-expand-md~.page [class^=container]{padding-left:1.5rem;padding-right:1.5rem}.navbar-vertical.navbar-expand-md.navbar-right~.page,.navbar-vertical.navbar-expand-md.navbar-end~.page{padding-left:0;padding-right:18rem}.navbar-vertical.navbar-expand-md .navbar-collapse{flex-direction:column}.navbar-vertical.navbar-expand-md .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-vertical.navbar-expand-md .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-vertical.navbar-expand-md .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-item.disabled{color:var(--tblr-disabled-color);pointer-events:none;background-color:transparent}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-vertical.navbar-expand-md .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media(min-width:992px){.navbar-vertical.navbar-expand-lg{width:18rem;position:fixed;top:0;left:0;bottom:0;z-index:1030;align-items:flex-start;transition:transform .3s;overflow-y:scroll;padding:0}}@media(min-width:992px)and (prefers-reduced-motion:reduce){.navbar-vertical.navbar-expand-lg{transition:none}}@media(min-width:992px){.navbar-vertical.navbar-expand-lg.navbar-right,.navbar-vertical.navbar-expand-lg.navbar-end{left:auto;right:0}.navbar-vertical.navbar-expand-lg .navbar-brand{padding:.75rem 0;justify-content:center}.navbar-vertical.navbar-expand-lg .navbar-collapse{align-items:stretch}.navbar-vertical.navbar-expand-lg .navbar-nav{flex-direction:column;flex-grow:1;min-height:auto}.navbar-vertical.navbar-expand-lg .navbar-nav .nav-link{padding-top:.5rem;padding-bottom:.5rem}.navbar-vertical.navbar-expand-lg>[class^=container]{flex-direction:column;align-items:stretch;min-height:100%;justify-content:flex-start;padding:0}.navbar-vertical.navbar-expand-lg~.page{padding-left:18rem}.navbar-vertical.navbar-expand-lg~.page [class^=container]{padding-left:1.5rem;padding-right:1.5rem}.navbar-vertical.navbar-expand-lg.navbar-right~.page,.navbar-vertical.navbar-expand-lg.navbar-end~.page{padding-left:0;padding-right:18rem}.navbar-vertical.navbar-expand-lg .navbar-collapse{flex-direction:column}.navbar-vertical.navbar-expand-lg .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-vertical.navbar-expand-lg .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-vertical.navbar-expand-lg .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item.disabled{color:var(--tblr-disabled-color);pointer-events:none;background-color:transparent}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-vertical.navbar-expand-lg .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media(min-width:1200px){.navbar-vertical.navbar-expand-xl{width:18rem;position:fixed;top:0;left:0;bottom:0;z-index:1030;align-items:flex-start;transition:transform .3s;overflow-y:scroll;padding:0}}@media(min-width:1200px)and (prefers-reduced-motion:reduce){.navbar-vertical.navbar-expand-xl{transition:none}}@media(min-width:1200px){.navbar-vertical.navbar-expand-xl.navbar-right,.navbar-vertical.navbar-expand-xl.navbar-end{left:auto;right:0}.navbar-vertical.navbar-expand-xl .navbar-brand{padding:.75rem 0;justify-content:center}.navbar-vertical.navbar-expand-xl .navbar-collapse{align-items:stretch}.navbar-vertical.navbar-expand-xl .navbar-nav{flex-direction:column;flex-grow:1;min-height:auto}.navbar-vertical.navbar-expand-xl .navbar-nav .nav-link{padding-top:.5rem;padding-bottom:.5rem}.navbar-vertical.navbar-expand-xl>[class^=container]{flex-direction:column;align-items:stretch;min-height:100%;justify-content:flex-start;padding:0}.navbar-vertical.navbar-expand-xl~.page{padding-left:18rem}.navbar-vertical.navbar-expand-xl~.page [class^=container]{padding-left:1.5rem;padding-right:1.5rem}.navbar-vertical.navbar-expand-xl.navbar-right~.page,.navbar-vertical.navbar-expand-xl.navbar-end~.page{padding-left:0;padding-right:18rem}.navbar-vertical.navbar-expand-xl .navbar-collapse{flex-direction:column}.navbar-vertical.navbar-expand-xl .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-vertical.navbar-expand-xl .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-vertical.navbar-expand-xl .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-item.disabled{color:var(--tblr-disabled-color);pointer-events:none;background-color:transparent}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-vertical.navbar-expand-xl .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media(min-width:1400px){.navbar-vertical.navbar-expand-xxl{width:18rem;position:fixed;top:0;left:0;bottom:0;z-index:1030;align-items:flex-start;transition:transform .3s;overflow-y:scroll;padding:0}}@media(min-width:1400px)and (prefers-reduced-motion:reduce){.navbar-vertical.navbar-expand-xxl{transition:none}}@media(min-width:1400px){.navbar-vertical.navbar-expand-xxl.navbar-right,.navbar-vertical.navbar-expand-xxl.navbar-end{left:auto;right:0}.navbar-vertical.navbar-expand-xxl .navbar-brand{padding:.75rem 0;justify-content:center}.navbar-vertical.navbar-expand-xxl .navbar-collapse{align-items:stretch}.navbar-vertical.navbar-expand-xxl .navbar-nav{flex-direction:column;flex-grow:1;min-height:auto}.navbar-vertical.navbar-expand-xxl .navbar-nav .nav-link{padding-top:.5rem;padding-bottom:.5rem}.navbar-vertical.navbar-expand-xxl>[class^=container]{flex-direction:column;align-items:stretch;min-height:100%;justify-content:flex-start;padding:0}.navbar-vertical.navbar-expand-xxl~.page{padding-left:18rem}.navbar-vertical.navbar-expand-xxl~.page [class^=container]{padding-left:1.5rem;padding-right:1.5rem}.navbar-vertical.navbar-expand-xxl.navbar-right~.page,.navbar-vertical.navbar-expand-xxl.navbar-end~.page{padding-left:0;padding-right:18rem}.navbar-vertical.navbar-expand-xxl .navbar-collapse{flex-direction:column}.navbar-vertical.navbar-expand-xxl .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-vertical.navbar-expand-xxl .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-vertical.navbar-expand-xxl .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-item.disabled{color:var(--tblr-disabled-color);pointer-events:none;background-color:transparent}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-vertical.navbar-expand-xxl .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}.navbar-vertical.navbar-expand{width:18rem;position:fixed;top:0;left:0;bottom:0;z-index:1030;align-items:flex-start;transition:transform .3s}@media(prefers-reduced-motion:reduce){.navbar-vertical.navbar-expand{transition:none}}.navbar-vertical.navbar-expand{overflow-y:scroll;padding:0}.navbar-vertical.navbar-expand.navbar-right,.navbar-vertical.navbar-expand.navbar-end{left:auto;right:0}.navbar-vertical.navbar-expand .navbar-brand{padding:.75rem 0;justify-content:center}.navbar-vertical.navbar-expand .navbar-collapse{align-items:stretch}.navbar-vertical.navbar-expand .navbar-nav{flex-direction:column;flex-grow:1;min-height:auto}.navbar-vertical.navbar-expand .navbar-nav .nav-link{padding-top:.5rem;padding-bottom:.5rem}.navbar-vertical.navbar-expand>[class^=container]{flex-direction:column;align-items:stretch;min-height:100%;justify-content:flex-start;padding:0}.navbar-vertical.navbar-expand~.page{padding-left:18rem}.navbar-vertical.navbar-expand~.page [class^=container]{padding-left:1.5rem;padding-right:1.5rem}.navbar-vertical.navbar-expand.navbar-right~.page,.navbar-vertical.navbar-expand.navbar-end~.page{padding-left:0;padding-right:18rem}.navbar-vertical.navbar-expand .navbar-collapse{flex-direction:column}.navbar-vertical.navbar-expand .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-vertical.navbar-expand .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-vertical.navbar-expand .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu .dropdown-item.disabled{color:var(--tblr-disabled-color);pointer-events:none;background-color:transparent}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-vertical.navbar-expand .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}.navbar-overlap:after{content:"";height:9rem;position:absolute;top:100%;left:0;right:0;background:inherit;z-index:-1;box-shadow:inherit}.page{display:flex;flex-direction:column;position:relative;min-height:100%}.page-center{justify-content:center}.page-wrapper{flex:1;display:flex;flex-direction:column}@media print{.page-wrapper{margin:0!important}}.page-wrapper-full .page-body:first-child{margin:0;border-top:0}.page-body{margin-top:var(--tblr-page-padding-y);margin-bottom:var(--tblr-page-padding-y);display:flex;flex-direction:column;flex:1}.page-body-card{background:var(--tblr-bg-surface);border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent);padding:var(--tblr-page-padding) 0;margin-bottom:0;flex:1}.page-body~.page-body-card{margin-top:0}.page-cover{background:no-repeat center/cover;min-height:9rem}@media(min-width:768px){.page-cover{min-height:12rem}}@media(min-width:992px){.page-cover{min-height:15rem}}.page-cover-overlay{position:relative}.page-cover-overlay:after{content:"";position:absolute;inset:0;background-image:linear-gradient(180deg,#0000,#0009)}.page-header{display:flex;flex-wrap:wrap;min-height:2.25rem;flex-direction:column;justify-content:center;max-width:100%}.page-wrapper .page-header{margin:var(--tblr-page-padding-y) 0 0}.page-header-border{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);padding:var(--tblr-page-padding-y) 0;margin:0!important;background-color:var(--tblr-bg-surface)}.page-pretitle{font-size:.75rem;font-weight:var(--tblr-font-weight-medium);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary)}.page-title{margin:0;font-size:var(--tblr-font-size-h2);line-height:var(--tblr-line-height-h2);font-weight:var(--tblr-font-weight-headings);color:inherit;display:flex;align-items:center}.page-title svg{width:1.5rem;height:1.5rem;margin-right:.25rem}.page-title-lg{font-size:1.5rem;line-height:2rem}.page-subtitle{margin-top:.25rem;color:var(--tblr-secondary)}.page-cover{--tblr-page-cover-blur: 20px;--tblr-page-cover-padding: 1rem;min-height:6rem;padding:var(--tblr-page-cover-padding) 0;position:relative;overflow:hidden}.page-cover-img{position:absolute;top:calc(-2 * var(--tblr-page-cover-blur, 0));left:calc(-2 * var(--tblr-page-cover-blur, 0));right:calc(-2 * var(--tblr-page-cover-blur, 0));bottom:calc(-2 * var(--tblr-page-cover-blur, 0));pointer-events:none;filter:blur(var(--tblr-page-cover-blur));object-fit:cover;background-size:cover;background-position:center;z-index:-1}.page-tabs{margin-top:.5rem;position:relative}.page-header-tabs .nav-bordered{border:0}.page-header-tabs+.page-body-card{margin-top:0}.footer{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);background-color:var(--tblr-bg-surface);padding:2rem 0;color:var(--tblr-gray-500);margin-top:auto}.footer-transparent{background-color:transparent;border-top:0}:root:not(.theme-dark):not([data-bs-theme=dark]) .hide-theme-light{display:none!important}:root:not(.theme-dark):not([data-bs-theme=dark]) .img-dark{display:none!important}:root.theme-dark .hide-theme-dark,:root[data-bs-theme=dark] .hide-theme-dark,body[data-bs-theme=dark] [data-bs-theme=light]:root .hide-theme-dark{display:none!important}:root.theme-dark .img-light,:root[data-bs-theme=dark] .img-light,body[data-bs-theme=dark] [data-bs-theme=light]:root .img-light{display:none!important}[data-bs-theme=dark],body[data-bs-theme=dark] [data-bs-theme=light]{color-scheme:dark;--tblr-body-color: var(--tblr-gray-200);--tblr-secondary: var(--tblr-gray-400);--tblr-body-bg: var(--tblr-gray-900);--tblr-emphasis-color: #ffffff;--tblr-emphasis-color-rgb: 255, 255, 255;--tblr-bg-forms: var(--tblr-gray-900);--tblr-bg-surface: var(--tblr-gray-800);--tblr-bg-surface-inverted: var(--tblr-gray-100);--tblr-bg-surface-secondary: var(--tblr-gray-900);--tblr-bg-surface-tertiary: var(--tblr-gray-800);--tblr-text-inverted: var(--tblr-gray-800);--tblr-link-color: var(--tblr-primary);--tblr-link-hover-color: color-mix(in srgb, var(--tblr-primary), black 20%);--tblr-active-bg: rgb(34.676744186, 45.8627906977, 61.523255814);--tblr-disabled-color: color-mix(in srgb, var(--tblr-body-color) 40%, transparent);--tblr-border-color: var(--tblr-gray-700);--tblr-border-color-translucent: var( --tblr-dark-mode-border-color-translucent );--tblr-border-dark-color: var(--tblr-dark-mode-border-dark-color);--tblr-border-active-color: var( --tblr-dark-mode-border-active-color );--tblr-btn-color: rgb(27.323255814, 36.1372093023, 48.476744186)}[data-bs-theme=dark] .navbar-brand-autodark .navbar-brand-image{filter:brightness(0) invert(1)}.accordion{--tblr-accordion-color: var(--tblr-body-color);--tblr-accordion-border-color: var(--tblr-border-color);--tblr-accordion-border-radius: var(--tblr-border-radius);--tblr-accordion-inner-border-radius: calc(var(--tblr-border-radius) - (var(--tblr-border-width)));--tblr-accordion-padding-x: 1.25rem;--tblr-accordion-gap: 0;--tblr-accordion-active-color: inherit;--tblr-accordion-btn-color: var(--tblr-accordion-color);--tblr-accordion-btn-bg: transparent;--tblr-accordion-btn-toggle-width: 1.25rem;--tblr-accordion-btn-padding-x: var(--tblr-accordion-padding-x);--tblr-accordion-btn-padding-y: 1rem;--tblr-accordion-btn-font-weight: var(--tblr-font-weight-medium);--tblr-accordion-body-padding-x: var(--tblr-accordion-padding-x);--tblr-accordion-body-padding-y: 1rem;display:flex;flex-direction:column;gap:var(--tblr-accordion-gap)}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:var(--tblr-accordion-btn-padding-y) var(--tblr-accordion-padding-x);color:inherit;text-align:inherit;background-color:transparent;border:0;font-size:inherit;font-weight:var(--tblr-accordion-btn-font-weight);gap:.75rem}.accordion-button:not(.collapsed){border-bottom-color:transparent;box-shadow:none;color:var(--tblr-accordion-active-color)}.accordion-header{margin:0;position:relative;display:flex;gap:1rem;align-items:center;width:100%;color:var(--tblr-accordion-btn-color);text-align:left;background-color:transparent;border:0;overflow-anchor:none;transition:transform .3s}.accordion-header:hover{z-index:2}.accordion-header:focus{z-index:3;outline:0;box-shadow:var(--tblr-accordion-btn-focus-box-shadow)}.accordion-header:focus:not(:focus-visible){outline:none;box-shadow:none}.accordion-button-icon{color:var(--tblr-secondary)}.accordion-button-toggle{display:flex;line-height:1;transition:.3s transform;margin-left:auto;margin-right:0;color:var(--tblr-secondary);width:var(--tblr-accordion-btn-toggle-width);height:var(--tblr-accordion-btn-toggle-width)}.accordion-button:not(.collapsed) .accordion-button-toggle{transform:rotate(-180deg);color:var(--tblr-accordion-active-color)}.accordion-button-toggle path{transition:.3s opacity}.accordion-button:not(.collapsed) .accordion-button-toggle-plus path:first-child{opacity:0}.accordion-item{color:var(--tblr-accordion-color);border:var(--tblr-border-width) solid var(--tblr-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--tblr-accordion-border-radius);border-top-right-radius:var(--tblr-accordion-border-radius)}.accordion-item:first-of-type>.accordion-header{border-top-left-radius:var(--tblr-accordion-inner-border-radius);border-top-right-radius:var(--tblr-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--tblr-accordion-border-radius);border-bottom-left-radius:var(--tblr-accordion-border-radius)}.accordion-item:last-of-type>.accordion-header.collapsed{border-bottom-right-radius:var(--tblr-accordion-inner-border-radius);border-bottom-left-radius:var(--tblr-accordion-inner-border-radius)}.accordion-item:last-of-type>.accordion-collapse{border-bottom-right-radius:var(--tblr-accordion-border-radius);border-bottom-left-radius:var(--tblr-accordion-border-radius)}.accordion-body{color:var(--tblr-secondary);padding:0 var(--tblr-accordion-body-padding-x) var(--tblr-accordion-body-padding-y)}.accordion-flush>.accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush>.accordion-item:first-child{border-top:0}.accordion-flush>.accordion-item:last-child{border-bottom:0}.accordion-flush>.accordion-item>.accordion-collapse,.accordion-flush>.accordion-item>.accordion-header .accordion-button,.accordion-flush>.accordion-item>.accordion-header .accordion-button.collapsed{border-radius:0}.accordion-tabs{--tblr-accordion-gap: .75rem}.accordion-tabs>.accordion-item{border:var(--tblr-border-width) solid var(--tblr-accordion-border-color);border-radius:var(--tblr-accordion-border-radius)}.accordion-inverted .accordion-button-toggle{order:-1;margin-left:0}.alert{--tblr-alert-color: var(--tblr-body-color);--tblr-alert-bg: color-mix(in srgb, var(--tblr-alert-color) 10%, transparent);--tblr-alert-padding-x: 1rem;--tblr-alert-padding-y: .75rem;--tblr-alert-margin-bottom: 1rem;--tblr-alert-border-color: color-mix(in srgb, var(--tblr-alert-color) 20%, transparent);--tblr-alert-border: var(--tblr-border-width) solid var(--tblr-alert-border-color);--tblr-alert-border-radius: var(--tblr-border-radius);--tblr-alert-link-color: inherit;--tblr-alert-heading-font-weight: var(--tblr-font-weight-medium);position:relative;padding:var(--tblr-alert-padding-y) var(--tblr-alert-padding-x);margin-bottom:var(--tblr-alert-margin-bottom);background-color:color-mix(in srgb,var(--tblr-alert-bg),var(--tblr-bg-surface));border-radius:var(--tblr-alert-border-radius);border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-alert-border-color);display:flex;flex-direction:row;gap:1rem}.alert-heading{color:inherit;margin-bottom:.25rem;font-weight:var(--tblr-alert-heading-font-weight)}.alert-description{color:var(--tblr-secondary)}.alert-icon{color:var(--tblr-alert-color);width:1.25rem!important;height:1.25rem!important}.alert-action{color:var(--tblr-alert-color);text-decoration:underline}.alert-action:hover{text-decoration:none}.alert-list{margin:0}.alert-link{font-weight:var(--tblr-font-weight-bold);color:var(--tblr-alert-link-color)}.alert-link,.alert-link:hover{color:var(--tblr-alert-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:calc(var(--tblr-alert-padding-x) / 2 - 1px);right:calc(var(--tblr-alert-padding-y) / 2 - 1px);z-index:1;padding:calc(var(--tblr-alert-padding-y) * 1.25) var(--tblr-alert-padding-x)}.alert-important{border-color:var(--tblr-alert-color);background-color:var(--tblr-alert-color);color:var(--tblr-white)}.alert-important .alert-description,.alert-important .alert-icon{color:inherit}.alert-minor{background:transparent;border-color:var(--tblr-border-color)}.alert-primary{--tblr-alert-color: var(--tblr-primary)}.alert-secondary{--tblr-alert-color: var(--tblr-secondary)}.alert-success{--tblr-alert-color: var(--tblr-success)}.alert-info{--tblr-alert-color: var(--tblr-info)}.alert-warning{--tblr-alert-color: var(--tblr-warning)}.alert-danger{--tblr-alert-color: var(--tblr-danger)}.alert-light{--tblr-alert-color: var(--tblr-light)}.alert-dark{--tblr-alert-color: var(--tblr-dark)}.alert-muted{--tblr-alert-color: var(--tblr-muted)}.alert-blue{--tblr-alert-color: var(--tblr-blue)}.alert-azure{--tblr-alert-color: var(--tblr-azure)}.alert-indigo{--tblr-alert-color: var(--tblr-indigo)}.alert-purple{--tblr-alert-color: var(--tblr-purple)}.alert-pink{--tblr-alert-color: var(--tblr-pink)}.alert-red{--tblr-alert-color: var(--tblr-red)}.alert-orange{--tblr-alert-color: var(--tblr-orange)}.alert-yellow{--tblr-alert-color: var(--tblr-yellow)}.alert-lime{--tblr-alert-color: var(--tblr-lime)}.alert-green{--tblr-alert-color: var(--tblr-green)}.alert-teal{--tblr-alert-color: var(--tblr-teal)}.alert-cyan{--tblr-alert-color: var(--tblr-cyan)}.avatar{--tblr-avatar-size: var(--tblr-avatar-list-size, 2.5rem);--tblr-avatar-status-size: .75rem;--tblr-avatar-bg: var(--tblr-bg-surface-secondary);--tblr-avatar-box-shadow-color: var(--tblr-border-color-translucent);--tblr-avatar-box-shadow: inset 0 0 0 1px var(--tblr-avatar-box-shadow-color);--tblr-avatar-font-size: 1rem;--tblr-avatar-icon-size: 1.5rem;--tblr-avatar-brand-size: 1.25rem;position:relative;width:var(--tblr-avatar-size);height:var(--tblr-avatar-size);font-size:var(--tblr-avatar-font-size);font-weight:var(--tblr-font-weight-medium);line-height:1;display:inline-flex;align-items:center;justify-content:center;color:var(--tblr-secondary);text-align:center;text-transform:uppercase;vertical-align:bottom;user-select:none;background:var(--tblr-avatar-bg) no-repeat center/cover;border-radius:var(--tblr-border-radius);box-shadow:var(--tblr-avatar-box-shadow);transition:color .3s,background-color .3s,box-shadow .3s}.avatar .icon{width:var(--tblr-avatar-icon-size);height:var(--tblr-avatar-icon-size)}.avatar .badge{position:absolute;right:0;bottom:0;border-radius:100rem;box-shadow:0 0 0 calc(var(--tblr-avatar-status-size) / 4) var(--tblr-bg-surface)}a.avatar{cursor:pointer}a.avatar:hover{color:var(--tblr-primary);--tblr-avatar-box-shadow-color: var(--tblr-primary)}.avatar-rounded{border-radius:100rem}.avatar-xxs{--tblr-avatar-size: 1rem;--tblr-avatar-status-size: .25rem;--tblr-avatar-font-size: .5rem;--tblr-avatar-icon-size: .5rem;--tblr-avatar-brand-size: .5rem}.avatar-xxs .badge:empty{width:.25rem;height:.25rem}.avatar-xs{--tblr-avatar-size: 1.25rem;--tblr-avatar-status-size: .375rem;--tblr-avatar-font-size: .625rem;--tblr-avatar-icon-size: .75rem;--tblr-avatar-brand-size: .75rem}.avatar-xs .badge:empty{width:.375rem;height:.375rem}.avatar-sm{--tblr-avatar-size: 2rem;--tblr-avatar-status-size: .5rem;--tblr-avatar-font-size: .75rem;--tblr-avatar-icon-size: 1.5rem;--tblr-avatar-brand-size: 1rem}.avatar-sm .badge:empty{width:.5rem;height:.5rem}.avatar-md{--tblr-avatar-size: 2.5rem;--tblr-avatar-status-size: .75rem;--tblr-avatar-font-size: .875rem;--tblr-avatar-icon-size: 1.5rem;--tblr-avatar-brand-size: 1.25rem}.avatar-md .badge:empty{width:.75rem;height:.75rem}.avatar-lg{--tblr-avatar-size: 3rem;--tblr-avatar-status-size: .75rem;--tblr-avatar-font-size: 1.25rem;--tblr-avatar-icon-size: 2rem;--tblr-avatar-brand-size: 1.25rem}.avatar-lg .badge:empty{width:.75rem;height:.75rem}.avatar-xl{--tblr-avatar-size: 5rem;--tblr-avatar-status-size: 1rem;--tblr-avatar-font-size: 2rem;--tblr-avatar-icon-size: 3rem;--tblr-avatar-brand-size: 1.25rem}.avatar-xl .badge:empty{width:1rem;height:1rem}.avatar-2xl{--tblr-avatar-size: 7rem;--tblr-avatar-status-size: 1rem;--tblr-avatar-font-size: 3rem;--tblr-avatar-icon-size: 5rem;--tblr-avatar-brand-size: 2rem}.avatar-2xl .badge:empty{width:1rem;height:1rem}.avatar-list{--tblr-avatar-list-size: 2.5rem;--tblr-list-gap: .5rem;display:flex;flex-wrap:wrap;gap:var(--tblr-list-gap)}.avatar-list a.avatar:hover{z-index:1}.avatar-list-stacked{display:block;--tblr-list-gap: 0}.avatar-list-stacked .avatar{margin-right:calc(-.5 * var(--tblr-avatar-size))!important;box-shadow:var(--tblr-avatar-box-shadow),0 0 0 2px var(--tblr-card-bg, var(--tblr-bg-surface))}.avatar-list-xxs{--tblr-avatar-list-size: 1rem}.avatar-list-xs{--tblr-avatar-list-size: 1.25rem}.avatar-list-sm{--tblr-avatar-list-size: 2rem}.avatar-list-md{--tblr-avatar-list-size: 2.5rem}.avatar-list-lg{--tblr-avatar-list-size: 3rem}.avatar-list-xl{--tblr-avatar-list-size: 5rem}.avatar-list-2xl{--tblr-avatar-list-size: 7rem}.avatar-upload{border:var(--tblr-border-width) dashed var(--tblr-border-color);background:var(--tblr-bg-forms);box-shadow:none;flex-direction:column;transition:color .3s,background-color .3s}@media(prefers-reduced-motion:reduce){.avatar-upload{transition:none}}.avatar-upload svg{width:1.5rem;height:1.5rem;stroke-width:1}.avatar-upload:hover{border-color:var(--tblr-primary);color:var(--tblr-primary);text-decoration:none}.avatar-upload-text{font-size:.625rem;line-height:1;margin-top:.25rem}.avatar-cover{margin-top:calc(-.5 * var(--tblr-avatar-size));box-shadow:0 0 0 .25rem var(--tblr-card-bg, var(--tblr-body-bg))}.avatar-brand{width:var(--tblr-avatar-brand-size);height:var(--tblr-avatar-brand-size);position:absolute;right:-2px;bottom:-2px;z-index:1000;background:var(--tblr-bg-surface);border-radius:var(--tblr-border-radius);border:1px solid var(--tblr-border-color)}.badge{--tblr-badge-padding-x: .5em;--tblr-badge-padding-y: .25em;--tblr-badge-font-size: .85714285em;--tblr-badge-font-weight: var(--tblr-font-weight-medium);--tblr-badge-color: var(--tblr-secondary);--tblr-badge-border-radius: var(--tblr-border-radius);--tblr-badge-icon-size: 1em;--tblr-badge-line-height: 1;display:inline-flex;padding:var(--tblr-badge-padding-y) var(--tblr-badge-padding-x);font-weight:var(--tblr-badge-font-weight);font-size:var(--tblr-badge-font-size);color:var(--tblr-badge-color);text-align:center;white-space:nowrap;justify-content:center;align-items:center;gap:.25rem;background:var(--tblr-bg-surface-secondary);overflow:hidden;user-select:none;border:var(--tblr-border-width) var(--tblr-border-style) transparent;border-radius:var(--tblr-badge-border-radius);min-width:calc(1em + var(--tblr-badge-padding-y) * 2 + 2px);letter-spacing:.04em;vertical-align:bottom;line-height:var(--tblr-badge-line-height)}a.badge{background:var(--tblr-bg-surface-secondary)}.badge .icon{width:1em;height:1em;font-size:var(--tblr-badge-icon-size);stroke-width:2}.badge:empty,.badge-dot{display:inline-block;width:10px;height:10px;min-width:0;min-height:auto;padding:0;border-radius:100rem;vertical-align:baseline}.badge-outline{background-color:transparent;border:var(--tblr-border-width) var(--tblr-border-style) currentColor}.badge-pill{border-radius:100rem}.badges-list{--tblr-list-gap: .5rem;display:flex;flex-wrap:wrap;gap:var(--tblr-list-gap)}.badge-notification{position:absolute!important;top:0!important;right:0!important;transform:translate(50%,-50%);z-index:1}.badge-blink{animation:blink 2s infinite}.badge-sm{--tblr-badge-font-size: .71428571em;--tblr-badge-icon-size: 1em;--tblr-badge-padding-y: 2px;--tblr-badge-padding-x: .25rem}.badge-lg{--tblr-badge-font-size: 1em;--tblr-badge-icon-size: 1em;--tblr-badge-padding-y: .25rem;--tblr-badge-padding-x: .5rem}.badge-icononly{--tblr-badge-padding-x: 0}.breadcrumb{--tblr-breadcrumb-padding-x: 0;--tblr-breadcrumb-padding-y: 0;--tblr-breadcrumb-margin-bottom: 1rem;--tblr-breadcrumb-font-size: ;--tblr-breadcrumb-bg: ;--tblr-breadcrumb-border-radius: ;--tblr-breadcrumb-divider-color: var(--tblr-gray-500);--tblr-breadcrumb-item-padding-x: .5rem;--tblr-breadcrumb-item-active-color: inherit;--tblr-breadcrumb-item-active-font-weight: var(--tblr-font-weight-bold);--tblr-breadcrumb-item-disabled-color: var(--tblr-disabled-color);--tblr-breadcrumb-link-color: var(--tblr-link-color);display:flex;flex-wrap:wrap;font-size:var(--tblr-breadcrumb-font-size);list-style:none;background-color:var(--tblr-breadcrumb-bg);border-radius:var(--tblr-breadcrumb-border-radius);padding:0;margin:0;background:transparent}.breadcrumb a{color:var(--tblr-breadcrumb-link-color)}.breadcrumb a:hover{text-decoration:underline}.breadcrumb-muted{--tblr-breadcrumb-link-color: var(--tblr-secondary)}.breadcrumb-item.active{color:var(--tblr-breadcrumb-item-active-color);font-weight:var(--tblr-breadcrumb-item-active-font-weight)}.breadcrumb-item.active a{color:inherit;pointer-events:none}.breadcrumb-item.disabled{color:var(--tblr-breadcrumb-item-disabled-color)}.breadcrumb-item.disabled:before{color:inherit}.breadcrumb-item.disabled a{color:inherit;pointer-events:none}.breadcrumb-item+.breadcrumb-item{padding-left:var(--tblr-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item:before{float:left;padding-right:var(--tblr-breadcrumb-item-padding-x);color:var(--tblr-breadcrumb-divider-color);content:var(--tblr-breadcrumb-divider, "/")}.breadcrumb-dots{--tblr-breadcrumb-divider: "\b7"}.breadcrumb-arrows{--tblr-breadcrumb-divider: "\203a"}.breadcrumb-bullets{--tblr-breadcrumb-divider: "\2022"}.btn{--tblr-btn-icon-size: 1.25rem;--tblr-btn-icon-color: inherit;--tblr-btn-bg: var(--tblr-bg-surface);--tblr-btn-color: var(--tblr-body-color);--tblr-btn-border-color: var(--tblr-border-color);--tblr-btn-hover-bg: var(--tblr-btn-bg);--tblr-btn-hover-border-color: var(--tblr-border-active-color);--tblr-btn-active-color: var(--tblr-primary);--tblr-btn-active-bg: rgba(var(--tblr-primary-rgb), .04);--tblr-btn-active-border-color: var(--tblr-primary);display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;box-shadow:var(--tblr-btn-box-shadow);position:relative;min-width:calc(var(--tblr-btn-line-height) * 1 + var(--tblr-btn-padding-y) * 2 + var(--tblr-btn-border-width) * 2);min-height:calc(var(--tblr-btn-line-height) * 1 + var(--tblr-btn-padding-y) * 2 + var(--tblr-btn-border-width) * 2)}.btn .icon{width:var(--tblr-btn-icon-size);height:var(--tblr-btn-icon-size);min-width:var(--tblr-btn-icon-size);font-size:var(--tblr-btn-icon-size);margin:0 calc(var(--tblr-btn-padding-x) / 2) 0 calc(var(--tblr-btn-padding-x) / -4);vertical-align:bottom;color:var(--tblr-btn-icon-color)}.btn .avatar{width:var(--tblr-btn-icon-size);height:var(--tblr-btn-icon-size);margin:0 calc(var(--tblr-btn-padding-x) / 2) 0 calc(var(--tblr-btn-padding-x) / -4)}.btn .icon-right,.btn .icon-end{margin:0 calc(var(--tblr-btn-padding-x) / -4) 0 calc(var(--tblr-btn-padding-x) / 2)}.btn .badge{top:auto}.btn-check+.btn:hover{color:var(--tblr-btn-hover-color);background-color:var(--tblr-btn-hover-bg);border-color:var(--tblr-btn-hover-border-color)}.btn-link{color:#009f95;background-color:transparent;border-color:transparent;box-shadow:none}.btn-link .icon{color:inherit}.btn-link:hover{color:#006a64;border-color:transparent}.btn-primary{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-primary-fg, #ffffff);--tblr-btn-bg: var(--tblr-primary);--tblr-btn-hover-color: var(--tblr-primary-fg);--tblr-btn-hover-bg: var(--tblr-primary-darken);--tblr-btn-active-color: var(--tblr-primary-fg);--tblr-btn-active-bg: var(--tblr-primary-darken);--tblr-btn-disabled-bg: var(--tblr-primary);--tblr-btn-disabled-color: var(--tblr-primary-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-primary,.btn-outline.btn-primary{--tblr-btn-color: var(--tblr-primary);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-primary);--tblr-btn-hover-color: var(--tblr-primary-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-primary);--tblr-btn-active-color: var(--tblr-primary-fg);--tblr-btn-active-bg: var(--tblr-primary);--tblr-btn-active-border-color: var(--tblr-primary);--tblr-btn-disabled-color: var(--tblr-primary);--tblr-btn-disabled-border-color: var(--tblr-primary)}.btn-ghost-primary,.btn-ghost.btn-primary{--tblr-btn-color: var(--tblr-primary);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-primary-fg);--tblr-btn-hover-bg: var(--tblr-primary);--tblr-btn-hover-border-color: var(--tblr-primary);--tblr-btn-active-color: var(--tblr-primary-fg);--tblr-btn-active-bg: var(--tblr-primary);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-primary);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-secondary,.btn-grey,.btn-gray{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-secondary-fg, #ffffff);--tblr-btn-bg: var(--tblr-secondary);--tblr-btn-hover-color: var(--tblr-secondary-fg);--tblr-btn-hover-bg: var(--tblr-secondary-darken);--tblr-btn-active-color: var(--tblr-secondary-fg);--tblr-btn-active-bg: var(--tblr-secondary-darken);--tblr-btn-disabled-bg: var(--tblr-secondary);--tblr-btn-disabled-color: var(--tblr-secondary-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-secondary,.btn-outline.btn-secondary,.btn-outline.btn-grey,.btn-outline.btn-gray{--tblr-btn-color: var(--tblr-secondary);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-secondary);--tblr-btn-hover-color: var(--tblr-secondary-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-secondary);--tblr-btn-active-color: var(--tblr-secondary-fg);--tblr-btn-active-bg: var(--tblr-secondary);--tblr-btn-active-border-color: var(--tblr-secondary);--tblr-btn-disabled-color: var(--tblr-secondary);--tblr-btn-disabled-border-color: var(--tblr-secondary)}.btn-ghost-secondary,.btn-ghost.btn-secondary,.btn-ghost.btn-grey,.btn-ghost.btn-gray{--tblr-btn-color: var(--tblr-secondary);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-secondary-fg);--tblr-btn-hover-bg: var(--tblr-secondary);--tblr-btn-hover-border-color: var(--tblr-secondary);--tblr-btn-active-color: var(--tblr-secondary-fg);--tblr-btn-active-bg: var(--tblr-secondary);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-secondary);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-success{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-success-fg, #ffffff);--tblr-btn-bg: var(--tblr-success);--tblr-btn-hover-color: var(--tblr-success-fg);--tblr-btn-hover-bg: var(--tblr-success-darken);--tblr-btn-active-color: var(--tblr-success-fg);--tblr-btn-active-bg: var(--tblr-success-darken);--tblr-btn-disabled-bg: var(--tblr-success);--tblr-btn-disabled-color: var(--tblr-success-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-success,.btn-outline.btn-success{--tblr-btn-color: var(--tblr-success);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-success);--tblr-btn-hover-color: var(--tblr-success-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-success);--tblr-btn-active-color: var(--tblr-success-fg);--tblr-btn-active-bg: var(--tblr-success);--tblr-btn-active-border-color: var(--tblr-success);--tblr-btn-disabled-color: var(--tblr-success);--tblr-btn-disabled-border-color: var(--tblr-success)}.btn-ghost-success,.btn-ghost.btn-success{--tblr-btn-color: var(--tblr-success);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-success-fg);--tblr-btn-hover-bg: var(--tblr-success);--tblr-btn-hover-border-color: var(--tblr-success);--tblr-btn-active-color: var(--tblr-success-fg);--tblr-btn-active-bg: var(--tblr-success);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-success);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-info{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-info-fg, #ffffff);--tblr-btn-bg: var(--tblr-info);--tblr-btn-hover-color: var(--tblr-info-fg);--tblr-btn-hover-bg: var(--tblr-info-darken);--tblr-btn-active-color: var(--tblr-info-fg);--tblr-btn-active-bg: var(--tblr-info-darken);--tblr-btn-disabled-bg: var(--tblr-info);--tblr-btn-disabled-color: var(--tblr-info-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-info,.btn-outline.btn-info{--tblr-btn-color: var(--tblr-info);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-info);--tblr-btn-hover-color: var(--tblr-info-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-info);--tblr-btn-active-color: var(--tblr-info-fg);--tblr-btn-active-bg: var(--tblr-info);--tblr-btn-active-border-color: var(--tblr-info);--tblr-btn-disabled-color: var(--tblr-info);--tblr-btn-disabled-border-color: var(--tblr-info)}.btn-ghost-info,.btn-ghost.btn-info{--tblr-btn-color: var(--tblr-info);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-info-fg);--tblr-btn-hover-bg: var(--tblr-info);--tblr-btn-hover-border-color: var(--tblr-info);--tblr-btn-active-color: var(--tblr-info-fg);--tblr-btn-active-bg: var(--tblr-info);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-info);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-warning{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-warning-fg, #ffffff);--tblr-btn-bg: var(--tblr-warning);--tblr-btn-hover-color: var(--tblr-warning-fg);--tblr-btn-hover-bg: var(--tblr-warning-darken);--tblr-btn-active-color: var(--tblr-warning-fg);--tblr-btn-active-bg: var(--tblr-warning-darken);--tblr-btn-disabled-bg: var(--tblr-warning);--tblr-btn-disabled-color: var(--tblr-warning-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-warning,.btn-outline.btn-warning{--tblr-btn-color: var(--tblr-warning);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-warning);--tblr-btn-hover-color: var(--tblr-warning-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-warning);--tblr-btn-active-color: var(--tblr-warning-fg);--tblr-btn-active-bg: var(--tblr-warning);--tblr-btn-active-border-color: var(--tblr-warning);--tblr-btn-disabled-color: var(--tblr-warning);--tblr-btn-disabled-border-color: var(--tblr-warning)}.btn-ghost-warning,.btn-ghost.btn-warning{--tblr-btn-color: var(--tblr-warning);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-warning-fg);--tblr-btn-hover-bg: var(--tblr-warning);--tblr-btn-hover-border-color: var(--tblr-warning);--tblr-btn-active-color: var(--tblr-warning-fg);--tblr-btn-active-bg: var(--tblr-warning);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-warning);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-danger{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-danger-fg, #ffffff);--tblr-btn-bg: var(--tblr-danger);--tblr-btn-hover-color: var(--tblr-danger-fg);--tblr-btn-hover-bg: var(--tblr-danger-darken);--tblr-btn-active-color: var(--tblr-danger-fg);--tblr-btn-active-bg: var(--tblr-danger-darken);--tblr-btn-disabled-bg: var(--tblr-danger);--tblr-btn-disabled-color: var(--tblr-danger-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-danger,.btn-outline.btn-danger{--tblr-btn-color: var(--tblr-danger);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-danger);--tblr-btn-hover-color: var(--tblr-danger-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-danger);--tblr-btn-active-color: var(--tblr-danger-fg);--tblr-btn-active-bg: var(--tblr-danger);--tblr-btn-active-border-color: var(--tblr-danger);--tblr-btn-disabled-color: var(--tblr-danger);--tblr-btn-disabled-border-color: var(--tblr-danger)}.btn-ghost-danger,.btn-ghost.btn-danger{--tblr-btn-color: var(--tblr-danger);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-danger-fg);--tblr-btn-hover-bg: var(--tblr-danger);--tblr-btn-hover-border-color: var(--tblr-danger);--tblr-btn-active-color: var(--tblr-danger-fg);--tblr-btn-active-bg: var(--tblr-danger);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-danger);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-light,.btn-white{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-light-fg, #ffffff);--tblr-btn-bg: var(--tblr-light);--tblr-btn-hover-color: var(--tblr-light-fg);--tblr-btn-hover-bg: var(--tblr-light-darken);--tblr-btn-active-color: var(--tblr-light-fg);--tblr-btn-active-bg: var(--tblr-light-darken);--tblr-btn-disabled-bg: var(--tblr-light);--tblr-btn-disabled-color: var(--tblr-light-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-light,.btn-outline.btn-light,.btn-outline.btn-white{--tblr-btn-color: var(--tblr-light);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-light);--tblr-btn-hover-color: var(--tblr-light-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-light);--tblr-btn-active-color: var(--tblr-light-fg);--tblr-btn-active-bg: var(--tblr-light);--tblr-btn-active-border-color: var(--tblr-light);--tblr-btn-disabled-color: var(--tblr-light);--tblr-btn-disabled-border-color: var(--tblr-light)}.btn-ghost-light,.btn-ghost.btn-light,.btn-ghost.btn-white{--tblr-btn-color: var(--tblr-light);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-light-fg);--tblr-btn-hover-bg: var(--tblr-light);--tblr-btn-hover-border-color: var(--tblr-light);--tblr-btn-active-color: var(--tblr-light-fg);--tblr-btn-active-bg: var(--tblr-light);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-light);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-dark,.btn-black{--tblr-btn-border-color: var(--tblr-dark-mode-border-color);--tblr-btn-hover-border-color: var(--tblr-dark-mode-border-active-color);--tblr-btn-active-border-color: var(--tblr-dark-mode-border-active-color);--tblr-btn-color: var(--tblr-dark-fg, #ffffff);--tblr-btn-bg: var(--tblr-dark);--tblr-btn-hover-color: var(--tblr-dark-fg);--tblr-btn-hover-bg: var(--tblr-dark-darken);--tblr-btn-active-color: var(--tblr-dark-fg);--tblr-btn-active-bg: var(--tblr-dark-darken);--tblr-btn-disabled-bg: var(--tblr-dark);--tblr-btn-disabled-color: var(--tblr-dark-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-dark,.btn-outline.btn-dark,.btn-outline.btn-black{--tblr-btn-color: var(--tblr-dark);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-dark);--tblr-btn-hover-color: var(--tblr-dark-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-dark);--tblr-btn-active-color: var(--tblr-dark-fg);--tblr-btn-active-bg: var(--tblr-dark);--tblr-btn-active-border-color: var(--tblr-dark);--tblr-btn-disabled-color: var(--tblr-dark);--tblr-btn-disabled-border-color: var(--tblr-dark)}.btn-ghost-dark,.btn-ghost.btn-dark,.btn-ghost.btn-black{--tblr-btn-color: var(--tblr-dark);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-dark-fg);--tblr-btn-hover-bg: var(--tblr-dark);--tblr-btn-hover-border-color: var(--tblr-dark);--tblr-btn-active-color: var(--tblr-dark-fg);--tblr-btn-active-bg: var(--tblr-dark);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-dark);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-muted{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-muted-fg, #ffffff);--tblr-btn-bg: var(--tblr-muted);--tblr-btn-hover-color: var(--tblr-muted-fg);--tblr-btn-hover-bg: var(--tblr-muted-darken);--tblr-btn-active-color: var(--tblr-muted-fg);--tblr-btn-active-bg: var(--tblr-muted-darken);--tblr-btn-disabled-bg: var(--tblr-muted);--tblr-btn-disabled-color: var(--tblr-muted-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-muted,.btn-outline.btn-muted{--tblr-btn-color: var(--tblr-muted);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-muted);--tblr-btn-hover-color: var(--tblr-muted-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-muted);--tblr-btn-active-color: var(--tblr-muted-fg);--tblr-btn-active-bg: var(--tblr-muted);--tblr-btn-active-border-color: var(--tblr-muted);--tblr-btn-disabled-color: var(--tblr-muted);--tblr-btn-disabled-border-color: var(--tblr-muted)}.btn-ghost-muted,.btn-ghost.btn-muted{--tblr-btn-color: var(--tblr-muted);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-muted-fg);--tblr-btn-hover-bg: var(--tblr-muted);--tblr-btn-hover-border-color: var(--tblr-muted);--tblr-btn-active-color: var(--tblr-muted-fg);--tblr-btn-active-bg: var(--tblr-muted);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-muted);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-blue{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-blue-fg, #ffffff);--tblr-btn-bg: var(--tblr-blue);--tblr-btn-hover-color: var(--tblr-blue-fg);--tblr-btn-hover-bg: var(--tblr-blue-darken);--tblr-btn-active-color: var(--tblr-blue-fg);--tblr-btn-active-bg: var(--tblr-blue-darken);--tblr-btn-disabled-bg: var(--tblr-blue);--tblr-btn-disabled-color: var(--tblr-blue-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-blue,.btn-outline.btn-blue{--tblr-btn-color: var(--tblr-blue);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-blue);--tblr-btn-hover-color: var(--tblr-blue-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-blue);--tblr-btn-active-color: var(--tblr-blue-fg);--tblr-btn-active-bg: var(--tblr-blue);--tblr-btn-active-border-color: var(--tblr-blue);--tblr-btn-disabled-color: var(--tblr-blue);--tblr-btn-disabled-border-color: var(--tblr-blue)}.btn-ghost-blue,.btn-ghost.btn-blue{--tblr-btn-color: var(--tblr-blue);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-blue-fg);--tblr-btn-hover-bg: var(--tblr-blue);--tblr-btn-hover-border-color: var(--tblr-blue);--tblr-btn-active-color: var(--tblr-blue-fg);--tblr-btn-active-bg: var(--tblr-blue);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-blue);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-azure{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-azure-fg, #ffffff);--tblr-btn-bg: var(--tblr-azure);--tblr-btn-hover-color: var(--tblr-azure-fg);--tblr-btn-hover-bg: var(--tblr-azure-darken);--tblr-btn-active-color: var(--tblr-azure-fg);--tblr-btn-active-bg: var(--tblr-azure-darken);--tblr-btn-disabled-bg: var(--tblr-azure);--tblr-btn-disabled-color: var(--tblr-azure-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-azure,.btn-outline.btn-azure{--tblr-btn-color: var(--tblr-azure);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-azure);--tblr-btn-hover-color: var(--tblr-azure-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-azure);--tblr-btn-active-color: var(--tblr-azure-fg);--tblr-btn-active-bg: var(--tblr-azure);--tblr-btn-active-border-color: var(--tblr-azure);--tblr-btn-disabled-color: var(--tblr-azure);--tblr-btn-disabled-border-color: var(--tblr-azure)}.btn-ghost-azure,.btn-ghost.btn-azure{--tblr-btn-color: var(--tblr-azure);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-azure-fg);--tblr-btn-hover-bg: var(--tblr-azure);--tblr-btn-hover-border-color: var(--tblr-azure);--tblr-btn-active-color: var(--tblr-azure-fg);--tblr-btn-active-bg: var(--tblr-azure);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-azure);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-indigo{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-indigo-fg, #ffffff);--tblr-btn-bg: var(--tblr-indigo);--tblr-btn-hover-color: var(--tblr-indigo-fg);--tblr-btn-hover-bg: var(--tblr-indigo-darken);--tblr-btn-active-color: var(--tblr-indigo-fg);--tblr-btn-active-bg: var(--tblr-indigo-darken);--tblr-btn-disabled-bg: var(--tblr-indigo);--tblr-btn-disabled-color: var(--tblr-indigo-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-indigo,.btn-outline.btn-indigo{--tblr-btn-color: var(--tblr-indigo);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-indigo);--tblr-btn-hover-color: var(--tblr-indigo-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-indigo);--tblr-btn-active-color: var(--tblr-indigo-fg);--tblr-btn-active-bg: var(--tblr-indigo);--tblr-btn-active-border-color: var(--tblr-indigo);--tblr-btn-disabled-color: var(--tblr-indigo);--tblr-btn-disabled-border-color: var(--tblr-indigo)}.btn-ghost-indigo,.btn-ghost.btn-indigo{--tblr-btn-color: var(--tblr-indigo);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-indigo-fg);--tblr-btn-hover-bg: var(--tblr-indigo);--tblr-btn-hover-border-color: var(--tblr-indigo);--tblr-btn-active-color: var(--tblr-indigo-fg);--tblr-btn-active-bg: var(--tblr-indigo);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-indigo);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-purple{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-purple-fg, #ffffff);--tblr-btn-bg: var(--tblr-purple);--tblr-btn-hover-color: var(--tblr-purple-fg);--tblr-btn-hover-bg: var(--tblr-purple-darken);--tblr-btn-active-color: var(--tblr-purple-fg);--tblr-btn-active-bg: var(--tblr-purple-darken);--tblr-btn-disabled-bg: var(--tblr-purple);--tblr-btn-disabled-color: var(--tblr-purple-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-purple,.btn-outline.btn-purple{--tblr-btn-color: var(--tblr-purple);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-purple);--tblr-btn-hover-color: var(--tblr-purple-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-purple);--tblr-btn-active-color: var(--tblr-purple-fg);--tblr-btn-active-bg: var(--tblr-purple);--tblr-btn-active-border-color: var(--tblr-purple);--tblr-btn-disabled-color: var(--tblr-purple);--tblr-btn-disabled-border-color: var(--tblr-purple)}.btn-ghost-purple,.btn-ghost.btn-purple{--tblr-btn-color: var(--tblr-purple);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-purple-fg);--tblr-btn-hover-bg: var(--tblr-purple);--tblr-btn-hover-border-color: var(--tblr-purple);--tblr-btn-active-color: var(--tblr-purple-fg);--tblr-btn-active-bg: var(--tblr-purple);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-purple);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-pink{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-pink-fg, #ffffff);--tblr-btn-bg: var(--tblr-pink);--tblr-btn-hover-color: var(--tblr-pink-fg);--tblr-btn-hover-bg: var(--tblr-pink-darken);--tblr-btn-active-color: var(--tblr-pink-fg);--tblr-btn-active-bg: var(--tblr-pink-darken);--tblr-btn-disabled-bg: var(--tblr-pink);--tblr-btn-disabled-color: var(--tblr-pink-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-pink,.btn-outline.btn-pink{--tblr-btn-color: var(--tblr-pink);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-pink);--tblr-btn-hover-color: var(--tblr-pink-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-pink);--tblr-btn-active-color: var(--tblr-pink-fg);--tblr-btn-active-bg: var(--tblr-pink);--tblr-btn-active-border-color: var(--tblr-pink);--tblr-btn-disabled-color: var(--tblr-pink);--tblr-btn-disabled-border-color: var(--tblr-pink)}.btn-ghost-pink,.btn-ghost.btn-pink{--tblr-btn-color: var(--tblr-pink);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-pink-fg);--tblr-btn-hover-bg: var(--tblr-pink);--tblr-btn-hover-border-color: var(--tblr-pink);--tblr-btn-active-color: var(--tblr-pink-fg);--tblr-btn-active-bg: var(--tblr-pink);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-pink);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-red{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-red-fg, #ffffff);--tblr-btn-bg: var(--tblr-red);--tblr-btn-hover-color: var(--tblr-red-fg);--tblr-btn-hover-bg: var(--tblr-red-darken);--tblr-btn-active-color: var(--tblr-red-fg);--tblr-btn-active-bg: var(--tblr-red-darken);--tblr-btn-disabled-bg: var(--tblr-red);--tblr-btn-disabled-color: var(--tblr-red-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-red,.btn-outline.btn-red{--tblr-btn-color: var(--tblr-red);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-red);--tblr-btn-hover-color: var(--tblr-red-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-red);--tblr-btn-active-color: var(--tblr-red-fg);--tblr-btn-active-bg: var(--tblr-red);--tblr-btn-active-border-color: var(--tblr-red);--tblr-btn-disabled-color: var(--tblr-red);--tblr-btn-disabled-border-color: var(--tblr-red)}.btn-ghost-red,.btn-ghost.btn-red{--tblr-btn-color: var(--tblr-red);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-red-fg);--tblr-btn-hover-bg: var(--tblr-red);--tblr-btn-hover-border-color: var(--tblr-red);--tblr-btn-active-color: var(--tblr-red-fg);--tblr-btn-active-bg: var(--tblr-red);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-red);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-orange{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-orange-fg, #ffffff);--tblr-btn-bg: var(--tblr-orange);--tblr-btn-hover-color: var(--tblr-orange-fg);--tblr-btn-hover-bg: var(--tblr-orange-darken);--tblr-btn-active-color: var(--tblr-orange-fg);--tblr-btn-active-bg: var(--tblr-orange-darken);--tblr-btn-disabled-bg: var(--tblr-orange);--tblr-btn-disabled-color: var(--tblr-orange-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-orange,.btn-outline.btn-orange{--tblr-btn-color: var(--tblr-orange);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-orange);--tblr-btn-hover-color: var(--tblr-orange-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-orange);--tblr-btn-active-color: var(--tblr-orange-fg);--tblr-btn-active-bg: var(--tblr-orange);--tblr-btn-active-border-color: var(--tblr-orange);--tblr-btn-disabled-color: var(--tblr-orange);--tblr-btn-disabled-border-color: var(--tblr-orange)}.btn-ghost-orange,.btn-ghost.btn-orange{--tblr-btn-color: var(--tblr-orange);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-orange-fg);--tblr-btn-hover-bg: var(--tblr-orange);--tblr-btn-hover-border-color: var(--tblr-orange);--tblr-btn-active-color: var(--tblr-orange-fg);--tblr-btn-active-bg: var(--tblr-orange);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-orange);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-yellow{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-yellow-fg, #ffffff);--tblr-btn-bg: var(--tblr-yellow);--tblr-btn-hover-color: var(--tblr-yellow-fg);--tblr-btn-hover-bg: var(--tblr-yellow-darken);--tblr-btn-active-color: var(--tblr-yellow-fg);--tblr-btn-active-bg: var(--tblr-yellow-darken);--tblr-btn-disabled-bg: var(--tblr-yellow);--tblr-btn-disabled-color: var(--tblr-yellow-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-yellow,.btn-outline.btn-yellow{--tblr-btn-color: var(--tblr-yellow);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-yellow);--tblr-btn-hover-color: var(--tblr-yellow-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-yellow);--tblr-btn-active-color: var(--tblr-yellow-fg);--tblr-btn-active-bg: var(--tblr-yellow);--tblr-btn-active-border-color: var(--tblr-yellow);--tblr-btn-disabled-color: var(--tblr-yellow);--tblr-btn-disabled-border-color: var(--tblr-yellow)}.btn-ghost-yellow,.btn-ghost.btn-yellow{--tblr-btn-color: var(--tblr-yellow);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-yellow-fg);--tblr-btn-hover-bg: var(--tblr-yellow);--tblr-btn-hover-border-color: var(--tblr-yellow);--tblr-btn-active-color: var(--tblr-yellow-fg);--tblr-btn-active-bg: var(--tblr-yellow);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-yellow);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-lime{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-lime-fg, #ffffff);--tblr-btn-bg: var(--tblr-lime);--tblr-btn-hover-color: var(--tblr-lime-fg);--tblr-btn-hover-bg: var(--tblr-lime-darken);--tblr-btn-active-color: var(--tblr-lime-fg);--tblr-btn-active-bg: var(--tblr-lime-darken);--tblr-btn-disabled-bg: var(--tblr-lime);--tblr-btn-disabled-color: var(--tblr-lime-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-lime,.btn-outline.btn-lime{--tblr-btn-color: var(--tblr-lime);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-lime);--tblr-btn-hover-color: var(--tblr-lime-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-lime);--tblr-btn-active-color: var(--tblr-lime-fg);--tblr-btn-active-bg: var(--tblr-lime);--tblr-btn-active-border-color: var(--tblr-lime);--tblr-btn-disabled-color: var(--tblr-lime);--tblr-btn-disabled-border-color: var(--tblr-lime)}.btn-ghost-lime,.btn-ghost.btn-lime{--tblr-btn-color: var(--tblr-lime);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-lime-fg);--tblr-btn-hover-bg: var(--tblr-lime);--tblr-btn-hover-border-color: var(--tblr-lime);--tblr-btn-active-color: var(--tblr-lime-fg);--tblr-btn-active-bg: var(--tblr-lime);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-lime);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-green{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-green-fg, #ffffff);--tblr-btn-bg: var(--tblr-green);--tblr-btn-hover-color: var(--tblr-green-fg);--tblr-btn-hover-bg: var(--tblr-green-darken);--tblr-btn-active-color: var(--tblr-green-fg);--tblr-btn-active-bg: var(--tblr-green-darken);--tblr-btn-disabled-bg: var(--tblr-green);--tblr-btn-disabled-color: var(--tblr-green-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-green,.btn-outline.btn-green{--tblr-btn-color: var(--tblr-green);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-green);--tblr-btn-hover-color: var(--tblr-green-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-green);--tblr-btn-active-color: var(--tblr-green-fg);--tblr-btn-active-bg: var(--tblr-green);--tblr-btn-active-border-color: var(--tblr-green);--tblr-btn-disabled-color: var(--tblr-green);--tblr-btn-disabled-border-color: var(--tblr-green)}.btn-ghost-green,.btn-ghost.btn-green{--tblr-btn-color: var(--tblr-green);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-green-fg);--tblr-btn-hover-bg: var(--tblr-green);--tblr-btn-hover-border-color: var(--tblr-green);--tblr-btn-active-color: var(--tblr-green-fg);--tblr-btn-active-bg: var(--tblr-green);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-green);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-teal{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-teal-fg, #ffffff);--tblr-btn-bg: var(--tblr-teal);--tblr-btn-hover-color: var(--tblr-teal-fg);--tblr-btn-hover-bg: var(--tblr-teal-darken);--tblr-btn-active-color: var(--tblr-teal-fg);--tblr-btn-active-bg: var(--tblr-teal-darken);--tblr-btn-disabled-bg: var(--tblr-teal);--tblr-btn-disabled-color: var(--tblr-teal-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-teal,.btn-outline.btn-teal{--tblr-btn-color: var(--tblr-teal);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-teal);--tblr-btn-hover-color: var(--tblr-teal-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-teal);--tblr-btn-active-color: var(--tblr-teal-fg);--tblr-btn-active-bg: var(--tblr-teal);--tblr-btn-active-border-color: var(--tblr-teal);--tblr-btn-disabled-color: var(--tblr-teal);--tblr-btn-disabled-border-color: var(--tblr-teal)}.btn-ghost-teal,.btn-ghost.btn-teal{--tblr-btn-color: var(--tblr-teal);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-teal-fg);--tblr-btn-hover-bg: var(--tblr-teal);--tblr-btn-hover-border-color: var(--tblr-teal);--tblr-btn-active-color: var(--tblr-teal-fg);--tblr-btn-active-bg: var(--tblr-teal);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-teal);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-cyan{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-cyan-fg, #ffffff);--tblr-btn-bg: var(--tblr-cyan);--tblr-btn-hover-color: var(--tblr-cyan-fg);--tblr-btn-hover-bg: var(--tblr-cyan-darken);--tblr-btn-active-color: var(--tblr-cyan-fg);--tblr-btn-active-bg: var(--tblr-cyan-darken);--tblr-btn-disabled-bg: var(--tblr-cyan);--tblr-btn-disabled-color: var(--tblr-cyan-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-cyan,.btn-outline.btn-cyan{--tblr-btn-color: var(--tblr-cyan);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-cyan);--tblr-btn-hover-color: var(--tblr-cyan-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-cyan);--tblr-btn-active-color: var(--tblr-cyan-fg);--tblr-btn-active-bg: var(--tblr-cyan);--tblr-btn-active-border-color: var(--tblr-cyan);--tblr-btn-disabled-color: var(--tblr-cyan);--tblr-btn-disabled-border-color: var(--tblr-cyan)}.btn-ghost-cyan,.btn-ghost.btn-cyan{--tblr-btn-color: var(--tblr-cyan);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-cyan-fg);--tblr-btn-hover-bg: var(--tblr-cyan);--tblr-btn-hover-border-color: var(--tblr-cyan);--tblr-btn-active-color: var(--tblr-cyan-fg);--tblr-btn-active-bg: var(--tblr-cyan);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-cyan);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-x{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-x-fg, #ffffff);--tblr-btn-bg: var(--tblr-x);--tblr-btn-hover-color: var(--tblr-x-fg);--tblr-btn-hover-bg: var(--tblr-x-darken);--tblr-btn-active-color: var(--tblr-x-fg);--tblr-btn-active-bg: var(--tblr-x-darken);--tblr-btn-disabled-bg: var(--tblr-x);--tblr-btn-disabled-color: var(--tblr-x-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-x,.btn-outline.btn-x{--tblr-btn-color: var(--tblr-x);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-x);--tblr-btn-hover-color: var(--tblr-x-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-x);--tblr-btn-active-color: var(--tblr-x-fg);--tblr-btn-active-bg: var(--tblr-x);--tblr-btn-active-border-color: var(--tblr-x);--tblr-btn-disabled-color: var(--tblr-x);--tblr-btn-disabled-border-color: var(--tblr-x)}.btn-ghost-x,.btn-ghost.btn-x{--tblr-btn-color: var(--tblr-x);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-x-fg);--tblr-btn-hover-bg: var(--tblr-x);--tblr-btn-hover-border-color: var(--tblr-x);--tblr-btn-active-color: var(--tblr-x-fg);--tblr-btn-active-bg: var(--tblr-x);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-x);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-facebook{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-facebook-fg, #ffffff);--tblr-btn-bg: var(--tblr-facebook);--tblr-btn-hover-color: var(--tblr-facebook-fg);--tblr-btn-hover-bg: var(--tblr-facebook-darken);--tblr-btn-active-color: var(--tblr-facebook-fg);--tblr-btn-active-bg: var(--tblr-facebook-darken);--tblr-btn-disabled-bg: var(--tblr-facebook);--tblr-btn-disabled-color: var(--tblr-facebook-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-facebook,.btn-outline.btn-facebook{--tblr-btn-color: var(--tblr-facebook);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-facebook);--tblr-btn-hover-color: var(--tblr-facebook-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-facebook);--tblr-btn-active-color: var(--tblr-facebook-fg);--tblr-btn-active-bg: var(--tblr-facebook);--tblr-btn-active-border-color: var(--tblr-facebook);--tblr-btn-disabled-color: var(--tblr-facebook);--tblr-btn-disabled-border-color: var(--tblr-facebook)}.btn-ghost-facebook,.btn-ghost.btn-facebook{--tblr-btn-color: var(--tblr-facebook);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-facebook-fg);--tblr-btn-hover-bg: var(--tblr-facebook);--tblr-btn-hover-border-color: var(--tblr-facebook);--tblr-btn-active-color: var(--tblr-facebook-fg);--tblr-btn-active-bg: var(--tblr-facebook);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-facebook);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-twitter{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-twitter-fg, #ffffff);--tblr-btn-bg: var(--tblr-twitter);--tblr-btn-hover-color: var(--tblr-twitter-fg);--tblr-btn-hover-bg: var(--tblr-twitter-darken);--tblr-btn-active-color: var(--tblr-twitter-fg);--tblr-btn-active-bg: var(--tblr-twitter-darken);--tblr-btn-disabled-bg: var(--tblr-twitter);--tblr-btn-disabled-color: var(--tblr-twitter-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-twitter,.btn-outline.btn-twitter{--tblr-btn-color: var(--tblr-twitter);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-twitter);--tblr-btn-hover-color: var(--tblr-twitter-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-twitter);--tblr-btn-active-color: var(--tblr-twitter-fg);--tblr-btn-active-bg: var(--tblr-twitter);--tblr-btn-active-border-color: var(--tblr-twitter);--tblr-btn-disabled-color: var(--tblr-twitter);--tblr-btn-disabled-border-color: var(--tblr-twitter)}.btn-ghost-twitter,.btn-ghost.btn-twitter{--tblr-btn-color: var(--tblr-twitter);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-twitter-fg);--tblr-btn-hover-bg: var(--tblr-twitter);--tblr-btn-hover-border-color: var(--tblr-twitter);--tblr-btn-active-color: var(--tblr-twitter-fg);--tblr-btn-active-bg: var(--tblr-twitter);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-twitter);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-linkedin{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-linkedin-fg, #ffffff);--tblr-btn-bg: var(--tblr-linkedin);--tblr-btn-hover-color: var(--tblr-linkedin-fg);--tblr-btn-hover-bg: var(--tblr-linkedin-darken);--tblr-btn-active-color: var(--tblr-linkedin-fg);--tblr-btn-active-bg: var(--tblr-linkedin-darken);--tblr-btn-disabled-bg: var(--tblr-linkedin);--tblr-btn-disabled-color: var(--tblr-linkedin-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-linkedin,.btn-outline.btn-linkedin{--tblr-btn-color: var(--tblr-linkedin);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-linkedin);--tblr-btn-hover-color: var(--tblr-linkedin-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-linkedin);--tblr-btn-active-color: var(--tblr-linkedin-fg);--tblr-btn-active-bg: var(--tblr-linkedin);--tblr-btn-active-border-color: var(--tblr-linkedin);--tblr-btn-disabled-color: var(--tblr-linkedin);--tblr-btn-disabled-border-color: var(--tblr-linkedin)}.btn-ghost-linkedin,.btn-ghost.btn-linkedin{--tblr-btn-color: var(--tblr-linkedin);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-linkedin-fg);--tblr-btn-hover-bg: var(--tblr-linkedin);--tblr-btn-hover-border-color: var(--tblr-linkedin);--tblr-btn-active-color: var(--tblr-linkedin-fg);--tblr-btn-active-bg: var(--tblr-linkedin);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-linkedin);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-google{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-google-fg, #ffffff);--tblr-btn-bg: var(--tblr-google);--tblr-btn-hover-color: var(--tblr-google-fg);--tblr-btn-hover-bg: var(--tblr-google-darken);--tblr-btn-active-color: var(--tblr-google-fg);--tblr-btn-active-bg: var(--tblr-google-darken);--tblr-btn-disabled-bg: var(--tblr-google);--tblr-btn-disabled-color: var(--tblr-google-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-google,.btn-outline.btn-google{--tblr-btn-color: var(--tblr-google);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-google);--tblr-btn-hover-color: var(--tblr-google-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-google);--tblr-btn-active-color: var(--tblr-google-fg);--tblr-btn-active-bg: var(--tblr-google);--tblr-btn-active-border-color: var(--tblr-google);--tblr-btn-disabled-color: var(--tblr-google);--tblr-btn-disabled-border-color: var(--tblr-google)}.btn-ghost-google,.btn-ghost.btn-google{--tblr-btn-color: var(--tblr-google);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-google-fg);--tblr-btn-hover-bg: var(--tblr-google);--tblr-btn-hover-border-color: var(--tblr-google);--tblr-btn-active-color: var(--tblr-google-fg);--tblr-btn-active-bg: var(--tblr-google);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-google);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-youtube{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-youtube-fg, #ffffff);--tblr-btn-bg: var(--tblr-youtube);--tblr-btn-hover-color: var(--tblr-youtube-fg);--tblr-btn-hover-bg: var(--tblr-youtube-darken);--tblr-btn-active-color: var(--tblr-youtube-fg);--tblr-btn-active-bg: var(--tblr-youtube-darken);--tblr-btn-disabled-bg: var(--tblr-youtube);--tblr-btn-disabled-color: var(--tblr-youtube-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-youtube,.btn-outline.btn-youtube{--tblr-btn-color: var(--tblr-youtube);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-youtube);--tblr-btn-hover-color: var(--tblr-youtube-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-youtube);--tblr-btn-active-color: var(--tblr-youtube-fg);--tblr-btn-active-bg: var(--tblr-youtube);--tblr-btn-active-border-color: var(--tblr-youtube);--tblr-btn-disabled-color: var(--tblr-youtube);--tblr-btn-disabled-border-color: var(--tblr-youtube)}.btn-ghost-youtube,.btn-ghost.btn-youtube{--tblr-btn-color: var(--tblr-youtube);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-youtube-fg);--tblr-btn-hover-bg: var(--tblr-youtube);--tblr-btn-hover-border-color: var(--tblr-youtube);--tblr-btn-active-color: var(--tblr-youtube-fg);--tblr-btn-active-bg: var(--tblr-youtube);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-youtube);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-vimeo{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-vimeo-fg, #ffffff);--tblr-btn-bg: var(--tblr-vimeo);--tblr-btn-hover-color: var(--tblr-vimeo-fg);--tblr-btn-hover-bg: var(--tblr-vimeo-darken);--tblr-btn-active-color: var(--tblr-vimeo-fg);--tblr-btn-active-bg: var(--tblr-vimeo-darken);--tblr-btn-disabled-bg: var(--tblr-vimeo);--tblr-btn-disabled-color: var(--tblr-vimeo-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-vimeo,.btn-outline.btn-vimeo{--tblr-btn-color: var(--tblr-vimeo);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-vimeo);--tblr-btn-hover-color: var(--tblr-vimeo-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-vimeo);--tblr-btn-active-color: var(--tblr-vimeo-fg);--tblr-btn-active-bg: var(--tblr-vimeo);--tblr-btn-active-border-color: var(--tblr-vimeo);--tblr-btn-disabled-color: var(--tblr-vimeo);--tblr-btn-disabled-border-color: var(--tblr-vimeo)}.btn-ghost-vimeo,.btn-ghost.btn-vimeo{--tblr-btn-color: var(--tblr-vimeo);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-vimeo-fg);--tblr-btn-hover-bg: var(--tblr-vimeo);--tblr-btn-hover-border-color: var(--tblr-vimeo);--tblr-btn-active-color: var(--tblr-vimeo-fg);--tblr-btn-active-bg: var(--tblr-vimeo);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-vimeo);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-dribbble{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-dribbble-fg, #ffffff);--tblr-btn-bg: var(--tblr-dribbble);--tblr-btn-hover-color: var(--tblr-dribbble-fg);--tblr-btn-hover-bg: var(--tblr-dribbble-darken);--tblr-btn-active-color: var(--tblr-dribbble-fg);--tblr-btn-active-bg: var(--tblr-dribbble-darken);--tblr-btn-disabled-bg: var(--tblr-dribbble);--tblr-btn-disabled-color: var(--tblr-dribbble-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-dribbble,.btn-outline.btn-dribbble{--tblr-btn-color: var(--tblr-dribbble);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-dribbble);--tblr-btn-hover-color: var(--tblr-dribbble-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-dribbble);--tblr-btn-active-color: var(--tblr-dribbble-fg);--tblr-btn-active-bg: var(--tblr-dribbble);--tblr-btn-active-border-color: var(--tblr-dribbble);--tblr-btn-disabled-color: var(--tblr-dribbble);--tblr-btn-disabled-border-color: var(--tblr-dribbble)}.btn-ghost-dribbble,.btn-ghost.btn-dribbble{--tblr-btn-color: var(--tblr-dribbble);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-dribbble-fg);--tblr-btn-hover-bg: var(--tblr-dribbble);--tblr-btn-hover-border-color: var(--tblr-dribbble);--tblr-btn-active-color: var(--tblr-dribbble-fg);--tblr-btn-active-bg: var(--tblr-dribbble);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-dribbble);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-github{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-github-fg, #ffffff);--tblr-btn-bg: var(--tblr-github);--tblr-btn-hover-color: var(--tblr-github-fg);--tblr-btn-hover-bg: var(--tblr-github-darken);--tblr-btn-active-color: var(--tblr-github-fg);--tblr-btn-active-bg: var(--tblr-github-darken);--tblr-btn-disabled-bg: var(--tblr-github);--tblr-btn-disabled-color: var(--tblr-github-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-github,.btn-outline.btn-github{--tblr-btn-color: var(--tblr-github);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-github);--tblr-btn-hover-color: var(--tblr-github-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-github);--tblr-btn-active-color: var(--tblr-github-fg);--tblr-btn-active-bg: var(--tblr-github);--tblr-btn-active-border-color: var(--tblr-github);--tblr-btn-disabled-color: var(--tblr-github);--tblr-btn-disabled-border-color: var(--tblr-github)}.btn-ghost-github,.btn-ghost.btn-github{--tblr-btn-color: var(--tblr-github);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-github-fg);--tblr-btn-hover-bg: var(--tblr-github);--tblr-btn-hover-border-color: var(--tblr-github);--tblr-btn-active-color: var(--tblr-github-fg);--tblr-btn-active-bg: var(--tblr-github);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-github);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-instagram{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-instagram-fg, #ffffff);--tblr-btn-bg: var(--tblr-instagram);--tblr-btn-hover-color: var(--tblr-instagram-fg);--tblr-btn-hover-bg: var(--tblr-instagram-darken);--tblr-btn-active-color: var(--tblr-instagram-fg);--tblr-btn-active-bg: var(--tblr-instagram-darken);--tblr-btn-disabled-bg: var(--tblr-instagram);--tblr-btn-disabled-color: var(--tblr-instagram-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-instagram,.btn-outline.btn-instagram{--tblr-btn-color: var(--tblr-instagram);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-instagram);--tblr-btn-hover-color: var(--tblr-instagram-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-instagram);--tblr-btn-active-color: var(--tblr-instagram-fg);--tblr-btn-active-bg: var(--tblr-instagram);--tblr-btn-active-border-color: var(--tblr-instagram);--tblr-btn-disabled-color: var(--tblr-instagram);--tblr-btn-disabled-border-color: var(--tblr-instagram)}.btn-ghost-instagram,.btn-ghost.btn-instagram{--tblr-btn-color: var(--tblr-instagram);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-instagram-fg);--tblr-btn-hover-bg: var(--tblr-instagram);--tblr-btn-hover-border-color: var(--tblr-instagram);--tblr-btn-active-color: var(--tblr-instagram-fg);--tblr-btn-active-bg: var(--tblr-instagram);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-instagram);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-pinterest{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-pinterest-fg, #ffffff);--tblr-btn-bg: var(--tblr-pinterest);--tblr-btn-hover-color: var(--tblr-pinterest-fg);--tblr-btn-hover-bg: var(--tblr-pinterest-darken);--tblr-btn-active-color: var(--tblr-pinterest-fg);--tblr-btn-active-bg: var(--tblr-pinterest-darken);--tblr-btn-disabled-bg: var(--tblr-pinterest);--tblr-btn-disabled-color: var(--tblr-pinterest-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-pinterest,.btn-outline.btn-pinterest{--tblr-btn-color: var(--tblr-pinterest);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-pinterest);--tblr-btn-hover-color: var(--tblr-pinterest-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-pinterest);--tblr-btn-active-color: var(--tblr-pinterest-fg);--tblr-btn-active-bg: var(--tblr-pinterest);--tblr-btn-active-border-color: var(--tblr-pinterest);--tblr-btn-disabled-color: var(--tblr-pinterest);--tblr-btn-disabled-border-color: var(--tblr-pinterest)}.btn-ghost-pinterest,.btn-ghost.btn-pinterest{--tblr-btn-color: var(--tblr-pinterest);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-pinterest-fg);--tblr-btn-hover-bg: var(--tblr-pinterest);--tblr-btn-hover-border-color: var(--tblr-pinterest);--tblr-btn-active-color: var(--tblr-pinterest-fg);--tblr-btn-active-bg: var(--tblr-pinterest);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-pinterest);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-vk{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-vk-fg, #ffffff);--tblr-btn-bg: var(--tblr-vk);--tblr-btn-hover-color: var(--tblr-vk-fg);--tblr-btn-hover-bg: var(--tblr-vk-darken);--tblr-btn-active-color: var(--tblr-vk-fg);--tblr-btn-active-bg: var(--tblr-vk-darken);--tblr-btn-disabled-bg: var(--tblr-vk);--tblr-btn-disabled-color: var(--tblr-vk-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-vk,.btn-outline.btn-vk{--tblr-btn-color: var(--tblr-vk);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-vk);--tblr-btn-hover-color: var(--tblr-vk-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-vk);--tblr-btn-active-color: var(--tblr-vk-fg);--tblr-btn-active-bg: var(--tblr-vk);--tblr-btn-active-border-color: var(--tblr-vk);--tblr-btn-disabled-color: var(--tblr-vk);--tblr-btn-disabled-border-color: var(--tblr-vk)}.btn-ghost-vk,.btn-ghost.btn-vk{--tblr-btn-color: var(--tblr-vk);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-vk-fg);--tblr-btn-hover-bg: var(--tblr-vk);--tblr-btn-hover-border-color: var(--tblr-vk);--tblr-btn-active-color: var(--tblr-vk-fg);--tblr-btn-active-bg: var(--tblr-vk);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-vk);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-rss{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-rss-fg, #ffffff);--tblr-btn-bg: var(--tblr-rss);--tblr-btn-hover-color: var(--tblr-rss-fg);--tblr-btn-hover-bg: var(--tblr-rss-darken);--tblr-btn-active-color: var(--tblr-rss-fg);--tblr-btn-active-bg: var(--tblr-rss-darken);--tblr-btn-disabled-bg: var(--tblr-rss);--tblr-btn-disabled-color: var(--tblr-rss-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-rss,.btn-outline.btn-rss{--tblr-btn-color: var(--tblr-rss);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-rss);--tblr-btn-hover-color: var(--tblr-rss-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-rss);--tblr-btn-active-color: var(--tblr-rss-fg);--tblr-btn-active-bg: var(--tblr-rss);--tblr-btn-active-border-color: var(--tblr-rss);--tblr-btn-disabled-color: var(--tblr-rss);--tblr-btn-disabled-border-color: var(--tblr-rss)}.btn-ghost-rss,.btn-ghost.btn-rss{--tblr-btn-color: var(--tblr-rss);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-rss-fg);--tblr-btn-hover-bg: var(--tblr-rss);--tblr-btn-hover-border-color: var(--tblr-rss);--tblr-btn-active-color: var(--tblr-rss-fg);--tblr-btn-active-bg: var(--tblr-rss);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-rss);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-flickr{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-flickr-fg, #ffffff);--tblr-btn-bg: var(--tblr-flickr);--tblr-btn-hover-color: var(--tblr-flickr-fg);--tblr-btn-hover-bg: var(--tblr-flickr-darken);--tblr-btn-active-color: var(--tblr-flickr-fg);--tblr-btn-active-bg: var(--tblr-flickr-darken);--tblr-btn-disabled-bg: var(--tblr-flickr);--tblr-btn-disabled-color: var(--tblr-flickr-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-flickr,.btn-outline.btn-flickr{--tblr-btn-color: var(--tblr-flickr);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-flickr);--tblr-btn-hover-color: var(--tblr-flickr-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-flickr);--tblr-btn-active-color: var(--tblr-flickr-fg);--tblr-btn-active-bg: var(--tblr-flickr);--tblr-btn-active-border-color: var(--tblr-flickr);--tblr-btn-disabled-color: var(--tblr-flickr);--tblr-btn-disabled-border-color: var(--tblr-flickr)}.btn-ghost-flickr,.btn-ghost.btn-flickr{--tblr-btn-color: var(--tblr-flickr);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-flickr-fg);--tblr-btn-hover-bg: var(--tblr-flickr);--tblr-btn-hover-border-color: var(--tblr-flickr);--tblr-btn-active-color: var(--tblr-flickr-fg);--tblr-btn-active-bg: var(--tblr-flickr);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-flickr);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-bitbucket{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-bitbucket-fg, #ffffff);--tblr-btn-bg: var(--tblr-bitbucket);--tblr-btn-hover-color: var(--tblr-bitbucket-fg);--tblr-btn-hover-bg: var(--tblr-bitbucket-darken);--tblr-btn-active-color: var(--tblr-bitbucket-fg);--tblr-btn-active-bg: var(--tblr-bitbucket-darken);--tblr-btn-disabled-bg: var(--tblr-bitbucket);--tblr-btn-disabled-color: var(--tblr-bitbucket-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-bitbucket,.btn-outline.btn-bitbucket{--tblr-btn-color: var(--tblr-bitbucket);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-bitbucket);--tblr-btn-hover-color: var(--tblr-bitbucket-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-bitbucket);--tblr-btn-active-color: var(--tblr-bitbucket-fg);--tblr-btn-active-bg: var(--tblr-bitbucket);--tblr-btn-active-border-color: var(--tblr-bitbucket);--tblr-btn-disabled-color: var(--tblr-bitbucket);--tblr-btn-disabled-border-color: var(--tblr-bitbucket)}.btn-ghost-bitbucket,.btn-ghost.btn-bitbucket{--tblr-btn-color: var(--tblr-bitbucket);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-bitbucket-fg);--tblr-btn-hover-bg: var(--tblr-bitbucket);--tblr-btn-hover-border-color: var(--tblr-bitbucket);--tblr-btn-active-color: var(--tblr-bitbucket-fg);--tblr-btn-active-bg: var(--tblr-bitbucket);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-bitbucket);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-tabler{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-tabler-fg, #ffffff);--tblr-btn-bg: var(--tblr-tabler);--tblr-btn-hover-color: var(--tblr-tabler-fg);--tblr-btn-hover-bg: var(--tblr-tabler-darken);--tblr-btn-active-color: var(--tblr-tabler-fg);--tblr-btn-active-bg: var(--tblr-tabler-darken);--tblr-btn-disabled-bg: var(--tblr-tabler);--tblr-btn-disabled-color: var(--tblr-tabler-fg);--tblr-btn-box-shadow: var(--tblr-shadow-input)}.btn-outline-tabler,.btn-outline.btn-tabler{--tblr-btn-color: var(--tblr-tabler);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-tabler);--tblr-btn-hover-color: var(--tblr-tabler-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-tabler);--tblr-btn-active-color: var(--tblr-tabler-fg);--tblr-btn-active-bg: var(--tblr-tabler);--tblr-btn-active-border-color: var(--tblr-tabler);--tblr-btn-disabled-color: var(--tblr-tabler);--tblr-btn-disabled-border-color: var(--tblr-tabler)}.btn-ghost-tabler,.btn-ghost.btn-tabler{--tblr-btn-color: var(--tblr-tabler);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-tabler-fg);--tblr-btn-hover-bg: var(--tblr-tabler);--tblr-btn-hover-border-color: var(--tblr-tabler);--tblr-btn-active-color: var(--tblr-tabler-fg);--tblr-btn-active-bg: var(--tblr-tabler);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-tabler);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-sm,.btn-group-sm>.btn{--tblr-btn-line-height: 1.3333333333;--tblr-btn-icon-size: 1rem}.btn-lg,.btn-group-lg>.btn{--tblr-btn-line-height: 1.5rem;--tblr-btn-icon-size: 1.5rem}.btn-xl,.btn-group-xl>.btn{--tblr-btn-line-height: 2;--tblr-btn-icon-size: 2rem;--tblr-btn-padding-y: .6875rem;--tblr-btn-padding-x: 2rem;--tblr-btn-font-size: 1.5rem}.btn-pill{padding-right:1.5em;padding-left:1.5em;border-radius:10rem}.btn-pill[class*=btn-icon]{padding:.375rem 15px}.btn-square{border-radius:0}.btn-icon,.btn-action{padding-left:0;padding-right:0}.btn-icon .icon,.btn-action .icon{margin:calc(-1 * var(--tblr-btn-padding-x))}.btn-list{--tblr-list-gap: .5rem;display:flex;flex-wrap:wrap;gap:var(--tblr-list-gap)}.btn-floating{position:fixed;z-index:1030;bottom:1rem;left:1rem;box-shadow:var(--tblr-shadow-dropdown)}.btn-loading{position:relative;color:transparent!important;text-shadow:none!important;pointer-events:none}.btn-loading>*{opacity:0}.btn-loading:after{content:"";display:inline-block;vertical-align:text-bottom;border:2px var(--tblr-border-style) currentColor;border-right-color:transparent;border-radius:100rem;color:var(--tblr-btn-color);position:absolute;width:var(--tblr-btn-icon-size);height:var(--tblr-btn-icon-size);left:calc(50% - var(--tblr-btn-icon-size) / 2);top:calc(50% - var(--tblr-btn-icon-size) / 2);animation:spinner-border .75s linear infinite}.btn-action{--tblr-border-color: transparent;color:var(--tblr-secondary);border-radius:var(--tblr-border-radius);background:transparent;box-shadow:none}.btn-action:after{content:none}.btn-action:focus{outline:none;box-shadow:none}.btn-action:hover,.btn-action.show{color:var(--tblr-body-color);background:var(--tblr-active-bg);border-color:transparent}.btn-action.show{color:var(--tblr-primary)}.btn-actions{display:flex}.btn-animate-icon .icon{transition:transform .3s ease}.btn-animate-icon:hover .icon,.btn-animate-icon:focus-visible .icon{transform:translate(4px)}.btn-animate-icon.btn-animate-icon-rotate:hover .icon,.btn-animate-icon.btn-animate-icon-rotate:focus-visible .icon{transform:rotate(90deg)}.btn-animate-icon.btn-animate-icon-move-start:hover .icon,.btn-animate-icon.btn-animate-icon-move-start:focus-visible .icon{transform:translate(-4px)}.btn-animate-icon.btn-animate-icon-pulse:hover .icon,.btn-animate-icon.btn-animate-icon-pulse:focus-visible .icon{transform:none;animation:pulse .9s}.btn-animate-icon.btn-animate-icon-shake:hover .icon,.btn-animate-icon.btn-animate-icon-shake:focus-visible .icon{transform:none;animation:shake .9s}.btn-animate-icon.btn-animate-icon-tada:hover .icon,.btn-animate-icon.btn-animate-icon-tada:focus-visible .icon{transform:none;animation:tada .9s}.btn-group,.btn-group-vertical{box-shadow:var(--tblr-shadow-input)}.btn-group>.btn-check:checked+.btn,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:5}.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus{z-index:1}.calendar{display:block;font-size:.765625rem;border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);border-radius:var(--tblr-border-radius)}.calendar-nav{display:flex;align-items:center}.calendar-title{flex:1;text-align:center}.calendar-body,.calendar-header{display:flex;flex-wrap:wrap;justify-content:flex-start;padding:.5rem 0}.calendar-header{color:var(--tblr-secondary)}.calendar-date{flex:0 0 14.2857142857%;max-width:14.2857142857%;padding:.2rem;text-align:center;border:0}.calendar-date.prev-month,.calendar-date.next-month{opacity:.25}.calendar-date .date-item{position:relative;display:inline-block;width:1.4rem;height:1.4rem;line-height:1.4rem;color:#66758c;text-align:center;text-decoration:none;white-space:nowrap;vertical-align:middle;cursor:pointer;background:0 0;border:var(--tblr-border-width) var(--tblr-border-style) transparent;border-radius:100rem;outline:0;transition:background .3s,border .3s,box-shadow .32s,color .3s}@media(prefers-reduced-motion:reduce){.calendar-date .date-item{transition:none}}.calendar-date .date-item:hover{color:var(--tblr-primary);text-decoration:none;background:#fefeff;border-color:var(--tblr-border-color)}.calendar-date .date-today{color:var(--tblr-primary);border-color:var(--tblr-border-color)}.calendar-range{position:relative}.calendar-range:before{position:absolute;top:50%;right:0;left:0;height:1.4rem;content:"";background:rgba(var(--tblr-primary-rgb),.1);transform:translateY(-50%)}.calendar-range.range-start .date-item,.calendar-range.range-end .date-item{color:#fff;background:var(--tblr-primary);border-color:var(--tblr-primary)}.calendar-range.range-start:before{left:50%}.calendar-range.range-end:before{right:50%}.carousel-indicators-vertical{left:auto;top:0;margin:0 1rem 0 0;flex-direction:column}.carousel-indicators-vertical [data-bs-target]{margin:3px 0;width:3px;height:30px;border:0;border-left:10px var(--tblr-border-style) transparent;border-right:10px var(--tblr-border-style) transparent}.carousel-indicators-dot [data-bs-target]{width:.5rem;height:.5rem;border-radius:100rem;border:10px var(--tblr-border-style) transparent;margin:0}.carousel-indicators-thumb [data-bs-target]{width:2rem;height:auto;background:no-repeat center/cover;border:0;border-radius:var(--tblr-border-radius);box-shadow:rgba(var(--tblr-body-color-rgb),.04) 0 2px 4px;margin:0 3px;opacity:.75}@media(min-width:992px){.carousel-indicators-thumb [data-bs-target]{width:4rem}}.carousel-indicators-thumb [data-bs-target]:before{content:"";padding-top:var(--tblr-aspect-ratio, 100%);display:block}.carousel-indicators-thumb.carousel-indicators-vertical [data-bs-target]{margin:3px 0}.carousel-caption-background{background:red;position:absolute;left:0;right:0;bottom:0;height:90%;background:linear-gradient(0deg,#1f2937e6,#1f293700)}.card{transition:transform .3s ease-out,opacity .3s ease-out,box-shadow .3s ease-out}@media(prefers-reduced-motion:reduce){.card{transition:none}}@media print{.card{border:none;box-shadow:none}}a.card{color:inherit}a.card:hover{text-decoration:none;box-shadow:rgba(var(--tblr-body-color-rgb),.16) 0 2px 16px}.card .card{box-shadow:none}.card-borderless,.card-borderless .card-header,.card-borderless .card-footer{border-color:transparent}.card-stamp{--tblr-stamp-size: 7rem;position:absolute;top:0;right:0;width:calc(var(--tblr-stamp-size) * 1);height:calc(var(--tblr-stamp-size) * 1);max-height:100%;border-top-right-radius:6px;opacity:.2;overflow:hidden;pointer-events:none}.card-stamp-lg{--tblr-stamp-size: 13rem}.card-stamp-icon{background:var(--tblr-secondary);color:var(--tblr-card-bg, var(--tblr-bg-surface));display:flex;align-items:center;justify-content:center;border-radius:100rem;width:calc(var(--tblr-stamp-size) * 1);height:calc(var(--tblr-stamp-size) * 1);position:relative;top:calc(var(--tblr-stamp-size) * -.25);right:calc(var(--tblr-stamp-size) * -.25);font-size:calc(var(--tblr-stamp-size) * .75);transform:rotate(10deg)}.card-stamp-icon .icon{stroke-width:2;width:calc(var(--tblr-stamp-size) * .75);height:calc(var(--tblr-stamp-size) * .75)}.card-img,.card-img-start{border-top-left-radius:calc(var(--tblr-border-radius-lg) - (var(--tblr-border-width)));border-bottom-left-radius:calc(var(--tblr-border-radius-lg) - (var(--tblr-border-width)))}.card-img,.card-img-end{border-top-right-radius:calc(var(--tblr-border-radius-lg) - (var(--tblr-border-width)));border-bottom-right-radius:calc(var(--tblr-border-radius-lg) - (var(--tblr-border-width)))}.card-img-overlay{display:flex;flex-direction:column;justify-content:flex-end}.card-img-overlay-dark{background-image:linear-gradient(180deg,#0000,#0009)}.card-inactive{pointer-events:none;box-shadow:none}.card-inactive .card-body{opacity:.64}.card-active{--tblr-card-border-color: var(--tblr-primary);--tblr-card-bg: var(--tblr-active-bg)}.card-btn{display:flex;align-items:center;justify-content:center;padding:1rem 1.25rem;text-align:center;transition:background .3s}@media(prefers-reduced-motion:reduce){.card-btn{transition:none}}.card-btn{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);flex:1;color:inherit;font-weight:var(--tblr-font-weight-medium)}.card-btn:hover{text-decoration:none;background:rgba(var(--tblr-primary-rgb),.04)}.card-btn+.card-btn{border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.card-stacked{--tblr-card-stacked-offset: .25rem;position:relative}.card-stacked:after{position:absolute;top:calc(-1 * var(--tblr-card-stacked-offset));right:var(--tblr-card-stacked-offset);left:var(--tblr-card-stacked-offset);height:var(--tblr-card-stacked-offset);content:"";background:var(--tblr-card-bg, var(--tblr-bg-surface));border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-card-border-color);border-radius:var(--tblr-card-border-radius) var(--tblr-card-border-radius) 0 0}.card-cover{position:relative;padding:1rem 1.25rem;background:#666 no-repeat center/cover}.card-cover:before{position:absolute;inset:0;content:"";background:#1f29377a}.card-cover:first-child,.card-cover:first-child:before{border-radius:6px 6px 0 0}.card-cover-blurred:before{backdrop-filter:blur(2px)}.card-actions{margin:-.5rem -.5rem -.5rem auto;padding-left:.5rem}.card-actions a{text-decoration:none}.card-header{color:inherit;display:flex;align-items:center;background:transparent}.card-header:first-child{border-radius:var(--tblr-card-border-radius) var(--tblr-card-border-radius) 0 0}.card-header-light{border-bottom-color:transparent;background:var(--tblr-bg-surface-tertiary)}.card-header-tabs{background:var(--tblr-bg-surface-tertiary);flex:1;margin:calc(var(--tblr-card-cap-padding-y) * -1) calc(var(--tblr-card-cap-padding-x) * -1) calc(var(--tblr-card-cap-padding-y) * -1);padding:calc(var(--tblr-card-cap-padding-y) * .5) calc(var(--tblr-card-cap-padding-x) * .5) 0;border-radius:var(--tblr-card-border-radius) var(--tblr-card-border-radius) 0 0}.card-header-pills{flex:1;margin-top:-.5rem;margin-bottom:-.5rem}.card-rotate-left,.card-rotate-start{transform:rotate(-1.5deg)}.card-rotate-right,.card-rotate-end{transform:rotate(1.5deg)}.card-link{color:inherit}.card-link:hover{color:inherit;text-decoration:none;box-shadow:0 1px 6px #00000014}.card-link-rotate:hover{transform:rotate(1.5deg);opacity:1}.card-link-pop:hover{transform:translateY(-2px);opacity:1}.card-footer{margin-top:auto}.card-footer:last-child{border-radius:0 0 var(--tblr-card-border-radius) var(--tblr-card-border-radius)}.card-footer-transparent{background:transparent;border-color:transparent;padding-top:0}.card-footer-borderless{border-top:none}.card-progress{height:.25rem}.card-progress:last-child{border-radius:0 0 2px 2px}.card-progress:first-child{border-radius:2px 2px 0 0}.card-meta{color:var(--tblr-secondary)}.card-title{display:block;margin:0 0 1rem;font-size:1rem;font-weight:var(--tblr-font-weight-medium);color:inherit;line-height:1.5rem}a.card-title:hover{color:inherit}.card-header .card-title{margin:0}.card-subtitle{margin-bottom:1.25rem;color:var(--tblr-secondary);font-weight:400}.card-header .card-subtitle{margin:0}.card-title .card-subtitle{margin:0 0 0 .25rem;font-size:.875rem}.card-body{position:relative}.card-body>:last-child{margin-bottom:0}.card-sm>.card-body{padding:1rem}@media(min-width:768px){.card-md>.card-body{padding:2.5rem}}@media(min-width:768px){.card-lg>.card-body{padding:2rem}}@media(min-width:992px){.card-lg>.card-body{padding:4rem}}@media print{.card-body{padding:0}}.card-body+.card-body{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.card-body-scrollable{overflow:auto}.card-options{top:1.5rem;right:.75rem;display:flex;margin-left:auto}.card-options-link{display:inline-block;min-width:1rem;margin-left:.25rem;color:var(--tblr-secondary)}.card-status-top{position:absolute;top:0;right:0;left:0;height:2px;border-radius:var(--tblr-card-border-radius) var(--tblr-card-border-radius) 0 0}.card-status-start{position:absolute;right:auto;bottom:0;width:2px;height:100%;border-radius:var(--tblr-card-border-radius) 0 0 var(--tblr-card-border-radius)}.card-status-bottom{position:absolute;top:initial;bottom:0;width:100%;height:2px;border-radius:0 0 var(--tblr-card-border-radius) var(--tblr-card-border-radius)}.card-table{margin-bottom:0!important}.card-table tr td:first-child,.card-table tr th:first-child{padding-left:1.25rem;border-left:0}.card-table tr td:last-child,.card-table tr th:last-child{padding-right:1.25rem;border-right:0}.card-table thead tr:first-child,.card-table tbody tr:first-child,.card-table tfoot tr:first-child,.card-table thead tr:first-child td,.card-table thead tr:first-child th,.card-table tbody tr:first-child td,.card-table tbody tr:first-child th,.card-table tfoot tr:first-child td,.card-table tfoot tr:first-child th{border-top:0}.card-body+.card-table{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-table-border-color)}.card-code{padding:0}.card-code .highlight{margin:0;border:0}.card-code pre{margin:0!important;border:0!important}.card-chart{position:relative;z-index:1;height:3.5rem}.card-avatar{margin-left:auto;margin-right:auto;box-shadow:0 0 0 .25rem var(--tblr-card-bg, var(--tblr-bg-surface));margin-top:calc(-1 * var(--tblr-avatar-size) * .5)}.card-body+.card-list-group{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.card-list-group .list-group-item{padding-right:1.25rem;padding-left:1.25rem;border-right:0;border-left:0;border-radius:0}.card-list-group .list-group-item:last-child{border-bottom:0}.card-list-group .list-group-item:first-child{border-top:0}.card-tabs .nav-tabs{position:relative;z-index:1000;border-bottom:0}.card-tabs .nav-tabs .nav-link{background:var(--tblr-bg-surface-tertiary);border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)}.card-tabs .nav-tabs .nav-link.active,.card-tabs .nav-tabs .nav-link:active,.card-tabs .nav-tabs .nav-link:hover{border-color:var(--tblr-border-color-translucent);color:var(--tblr-body-color)}.card-tabs .nav-tabs .nav-link.active{color:inherit;background:var(--tblr-card-bg, var(--tblr-bg-surface));border-bottom-color:transparent}.card-tabs .nav-tabs .nav-item:not(:first-child) .nav-link{border-top-left-radius:0}.card-tabs .nav-tabs .nav-item:not(:last-child) .nav-link{border-top-right-radius:0}.card-tabs .nav-tabs .nav-item+.nav-item{margin-left:calc(-1 * var(--tblr-border-width))}.card-tabs .nav-tabs-bottom,.card-tabs .nav-tabs-bottom .nav-link{margin-bottom:0}.card-tabs .nav-tabs-bottom .nav-link.active{border-top-color:transparent}.card-tabs .nav-tabs-bottom .nav-item{margin-top:calc(-1 * var(--tblr-border-width));margin-bottom:0}.card-tabs .nav-tabs-bottom .nav-item .nav-link{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent);border-radius:0 0 var(--tblr-border-radius-lg) var(--tblr-border-radius-lg)}.card-tabs .nav-tabs-bottom .nav-item:not(:first-child) .nav-link{border-bottom-left-radius:0}.card-tabs .nav-tabs-bottom .nav-item:not(:last-child) .nav-link{border-bottom-right-radius:0}.card-tabs .card{border-bottom-left-radius:0}.card-tabs .nav-tabs+.tab-content .card{border-bottom-left-radius:var(--tblr-card-border-radius);border-top-left-radius:0}.card-note{--tblr-card-bg: #fff7dd;--tblr-card-border-color: #fff1c9}.btn-close{--tblr-btn-close-color: currentColor;--tblr-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%231f2937'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414'/%3e%3c/svg%3e");--tblr-btn-close-opacity: .4;--tblr-btn-close-hover-opacity: .75;--tblr-btn-close-focus-shadow: 0 0 0 .25rem rgba(var(--tblr-primary-rgb), .25);--tblr-btn-close-focus-opacity: 1;--tblr-btn-close-disabled-opacity: .25;--tblr-btn-close-size: 1em;width:var(--tblr-btn-close-size);height:var(--tblr-btn-close-size);padding:.25em;color:var(--tblr-btn-close-color);mask:var(--tblr-btn-close-bg) no-repeat center/calc(var(--tblr-btn-close-size) * .75);background-color:var(--tblr-btn-close-color);border:0;border-radius:var(--tblr-border-radius);opacity:var(--tblr-btn-close-opacity);cursor:pointer;display:block}.btn-close:hover{color:var(--tblr-btn-close-color);text-decoration:none;opacity:var(--tblr-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--tblr-btn-close-focus-shadow);opacity:var(--tblr-btn-close-focus-opacity)}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;opacity:var(--tblr-btn-close-disabled-opacity)}.dropdown-menu{user-select:none;background-clip:border-box}.dropdown-menu.card{padding:0;min-width:25rem;display:none}.dropdown-menu.card.show{display:flex}.dropdown-item{min-width:11rem;display:flex;align-items:center;margin:0;line-height:1.4285714286;gap:.5rem}.dropdown-item-icon{width:1.25rem!important;height:1.25rem!important;margin-right:.5rem;color:var(--tblr-secondary);opacity:.7;text-align:center}.dropdown-item-indicator{margin-right:.5rem;margin-left:-.25rem;height:1.25rem;display:inline-flex;line-height:1;vertical-align:bottom;align-items:center}.dropdown-header{font-size:.75rem;font-weight:var(--tblr-font-weight-medium);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);padding-bottom:.25rem;pointer-events:none}.dropdown-menu-scrollable{height:auto;max-height:13rem;overflow-x:hidden}.dropdown-menu-column{min-width:11rem}.dropdown-menu-column .dropdown-item{min-width:0}.dropdown-menu-columns{display:flex;flex:0 .25rem}.dropdown-menu-arrow:before{content:"";position:absolute;top:-.25rem;left:.75rem;display:block;background:inherit;width:14px;height:14px;transform:rotate(45deg);transform-origin:center;border:1px solid;border-color:inherit;z-index:-1;clip:rect(0px,9px,9px,0px)}.dropdown-menu-arrow.dropdown-menu-end:before{right:.75rem;left:auto}.dropend>.dropdown-menu{margin-top:calc(-.25rem - 1px);margin-left:-.25rem}.dropend .dropdown-toggle:after{margin-left:auto}.dropdown-menu-card{padding:0;min-width:20rem}.dropdown-menu-card>.card{margin:0;border:0;box-shadow:none}.datagrid{--tblr-datagrid-padding: 1.5rem;--tblr-datagrid-item-width: 15rem;display:grid;grid-gap:var(--tblr-datagrid-padding);grid-template-columns:repeat(auto-fit,minmax(var(--tblr-datagrid-item-width),1fr))}.datagrid-title{font-size:.75rem;font-weight:var(--tblr-font-weight-medium);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);margin-bottom:.25rem}.empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;padding:1rem;text-align:center}@media(min-width:768px){.empty{padding:3rem}}.empty-icon{margin:0 0 1rem;width:3rem;height:3rem;line-height:1;color:var(--tblr-secondary)}.empty-icon svg{width:100%;height:100%}.empty-img{margin:0 0 2rem;line-height:1}.empty-header{margin:0 0 1rem;font-size:4rem;font-weight:var(--tblr-font-weight-light);line-height:1;color:var(--tblr-secondary)}.empty-title{font-size:1.25rem;line-height:1.75rem;font-weight:var(--tblr-font-weight-bold)}.empty-title,.empty-subtitle{margin:0 0 .5rem}.empty-action{margin-top:1.5rem}.empty-bordered{border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);border-radius:var(--tblr-border-radius)}.row>*{min-width:0}.col-separator{border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.container-slim{--tblr-gutter-x: calc(var(--tblr-page-padding) * 2);--tblr-gutter-y: 0;width:100%;padding-right:calc(var(--tblr-gutter-x) * .5);padding-left:calc(var(--tblr-gutter-x) * .5);margin-right:auto;margin-left:auto;max-width:16rem}.container-tight{--tblr-gutter-x: calc(var(--tblr-page-padding) * 2);--tblr-gutter-y: 0;width:100%;padding-right:calc(var(--tblr-gutter-x) * .5);padding-left:calc(var(--tblr-gutter-x) * .5);margin-right:auto;margin-left:auto;max-width:30rem}.container-narrow{--tblr-gutter-x: calc(var(--tblr-page-padding) * 2);--tblr-gutter-y: 0;width:100%;padding-right:calc(var(--tblr-gutter-x) * .5);padding-left:calc(var(--tblr-gutter-x) * .5);margin-right:auto;margin-left:auto;max-width:61.875rem}.row-0{margin-right:0;margin-left:0}.row-0>.col,.row-0>[class*=col-]{padding-right:0;padding-left:0}.row-0 .card{margin-bottom:0}.row-sm{margin-right:-.375rem;margin-left:-.375rem}.row-sm>.col,.row-sm>[class*=col-]{padding-right:.375rem;padding-left:.375rem}.row-sm .card{margin-bottom:.75rem}.row-md{margin-right:-1.5rem;margin-left:-1.5rem}.row-md>.col,.row-md>[class*=col-]{padding-right:1.5rem;padding-left:1.5rem}.row-md .card{margin-bottom:3rem}.row-lg{margin-right:-3rem;margin-left:-3rem}.row-lg>.col,.row-lg>[class*=col-]{padding-right:3rem;padding-left:3rem}.row-lg .card{margin-bottom:6rem}.row-deck>.col,.row-deck>[class*=col-]{display:flex;align-items:stretch}.row-deck>.col .card,.row-deck>[class*=col-] .card{flex:1 1 auto}.row-cards{--tblr-gutter-x: var(--tblr-page-padding);--tblr-gutter-y: var(--tblr-page-padding);min-width:0}.row-cards .row-cards{flex:1}.space-y{display:flex;flex-direction:column;gap:1rem}.space-x{display:flex;gap:1rem}.space-y-0{display:flex;flex-direction:column;gap:0}.space-x-0{display:flex;gap:0}.space-y-1{display:flex;flex-direction:column;gap:.25rem}.space-x-1{display:flex;gap:.25rem}.space-y-2{display:flex;flex-direction:column;gap:.5rem}.space-x-2{display:flex;gap:.5rem}.space-y-3{display:flex;flex-direction:column;gap:1rem}.space-x-3{display:flex;gap:1rem}.space-y-4{display:flex;flex-direction:column;gap:1.5rem}.space-x-4{display:flex;gap:1.5rem}.space-y-5{display:flex;flex-direction:column;gap:2rem}.space-x-5{display:flex;gap:2rem}.space-y-6{display:flex;flex-direction:column;gap:2.5rem}.space-x-6{display:flex;gap:2.5rem}.divide-y>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y>:not(template):not(:first-child){padding-top:1rem!important}.divide-y>:not(template):not(:last-child){padding-bottom:1rem!important}.divide-x>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x>:not(template):not(:first-child){padding-left:1rem!important}.divide-x>:not(template):not(:last-child){padding-right:1rem!important}.divide-y-0>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y-0>:not(template):not(:first-child){padding-top:0!important}.divide-y-0>:not(template):not(:last-child){padding-bottom:0!important}.divide-x-0>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x-0>:not(template):not(:first-child){padding-left:0!important}.divide-x-0>:not(template):not(:last-child){padding-right:0!important}.divide-y-1>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y-1>:not(template):not(:first-child){padding-top:.25rem!important}.divide-y-1>:not(template):not(:last-child){padding-bottom:.25rem!important}.divide-x-1>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x-1>:not(template):not(:first-child){padding-left:.25rem!important}.divide-x-1>:not(template):not(:last-child){padding-right:.25rem!important}.divide-y-2>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y-2>:not(template):not(:first-child){padding-top:.5rem!important}.divide-y-2>:not(template):not(:last-child){padding-bottom:.5rem!important}.divide-x-2>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x-2>:not(template):not(:first-child){padding-left:.5rem!important}.divide-x-2>:not(template):not(:last-child){padding-right:.5rem!important}.divide-y-3>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y-3>:not(template):not(:first-child){padding-top:1rem!important}.divide-y-3>:not(template):not(:last-child){padding-bottom:1rem!important}.divide-x-3>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x-3>:not(template):not(:first-child){padding-left:1rem!important}.divide-x-3>:not(template):not(:last-child){padding-right:1rem!important}.divide-y-4>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y-4>:not(template):not(:first-child){padding-top:1.5rem!important}.divide-y-4>:not(template):not(:last-child){padding-bottom:1.5rem!important}.divide-x-4>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x-4>:not(template):not(:first-child){padding-left:1.5rem!important}.divide-x-4>:not(template):not(:last-child){padding-right:1.5rem!important}.divide-y-5>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y-5>:not(template):not(:first-child){padding-top:2rem!important}.divide-y-5>:not(template):not(:last-child){padding-bottom:2rem!important}.divide-x-5>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x-5>:not(template):not(:first-child){padding-left:2rem!important}.divide-x-5>:not(template):not(:last-child){padding-right:2rem!important}.divide-y-6>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y-6>:not(template):not(:first-child){padding-top:2.5rem!important}.divide-y-6>:not(template):not(:last-child){padding-bottom:2.5rem!important}.divide-x-6>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x-6>:not(template):not(:first-child){padding-left:2.5rem!important}.divide-x-6>:not(template):not(:last-child){padding-right:2.5rem!important}.divide-y-fill{display:flex;flex-direction:column;height:100%}.divide-y-fill>:not(template){flex:1;display:flex;justify-content:center;flex-direction:column}.icon{--tblr-icon-size: 1.25rem;width:var(--tblr-icon-size);height:var(--tblr-icon-size);font-size:var(--tblr-icon-size);vertical-align:bottom;stroke-width:1.5}.icon:hover{text-decoration:none}.icon-inline{--tblr-icon-size: 1rem;vertical-align:-.2rem}.icon-filled{fill:currentColor}.icon-sm{--tblr-icon-size: 1rem;stroke-width:1}.icon-md{--tblr-icon-size: 2.5rem;stroke-width:1}.icon-lg{--tblr-icon-size: 3.5rem;stroke-width:1}.icon-pulse{transition:all .15s ease 0s;animation:pulse 2s ease infinite;animation-fill-mode:both}.icon-tada{transition:all .15s ease 0s;animation:tada 3s ease infinite;animation-fill-mode:both}.icon-rotate{transition:all .15s ease 0s;animation:rotate-360 3s linear infinite;animation-fill-mode:both}.img-responsive{--tblr-img-responsive-ratio: 75%;background:no-repeat center/cover;padding-top:var(--tblr-img-responsive-ratio)}.img-responsive-grid{padding-top:calc(var(--tblr-img-responsive-ratio) - var(--tblr-gutter-y) / 2)}.img-responsive-1x1{--tblr-img-responsive-ratio: 100%}.img-responsive-2x1{--tblr-img-responsive-ratio: 50%}.img-responsive-1x2{--tblr-img-responsive-ratio: 200%}.img-responsive-3x1{--tblr-img-responsive-ratio: 33.3333333333%}.img-responsive-1x3{--tblr-img-responsive-ratio: 300%}.img-responsive-4x1{--tblr-img-responsive-ratio: 25%}.img-responsive-1x4{--tblr-img-responsive-ratio: 400%}.img-responsive-4x3{--tblr-img-responsive-ratio: 75%}.img-responsive-3x4{--tblr-img-responsive-ratio: 133.3333333333%}.img-responsive-16x9{--tblr-img-responsive-ratio: 56.25%}.img-responsive-9x16{--tblr-img-responsive-ratio: 177.7777777778%}.img-responsive-21x9{--tblr-img-responsive-ratio: 42.8571428571%}.img-responsive-9x21{--tblr-img-responsive-ratio: 233.3333333333%}.img-bg{background:no-repeat center/cover}textarea[cols]{height:auto}.col-form-label,.form-label{display:block;font-weight:var(--tblr-font-weight-medium)}.col-form-label.required:after,.form-label.required:after{content:"*";margin-left:.25rem;color:#d63939}.form-label-description{float:right;font-weight:var(--tblr-font-weight-normal);color:var(--tblr-secondary)}.form-hint{display:block;color:var(--tblr-secondary)}.form-hint:last-child{margin-bottom:0}.form-hint+.form-control{margin-top:.25rem}.form-label+.form-hint{margin-top:-.25rem}.input-group+.form-hint,.form-control+.form-hint,.form-select+.form-hint{margin-top:.5rem;color:var(--tblr-secondary)}.form-select:-moz-focusring{color:var(--tblr-body-color)}.form-control:-webkit-autofill{box-shadow:0 0 0 1000px var(--tblr-bg-surface-secondary) inset;color:var(--tblr-body-color);-webkit-text-fill-color:var(--tblr-body-color)}.form-control:disabled,.form-control.disabled{color:var(--tblr-secondary);user-select:none}.form-control[size]{width:auto}.form-control-light{background-color:var(--tblr-gray-100);border-color:transparent}.form-control-dark{background-color:#0000001a;color:#fff;border-color:transparent}.form-control-dark:focus{background-color:#0000001a;box-shadow:none;border-color:#ffffff3d}.form-control-dark::placeholder{color:#fff9}.form-control-rounded{border-radius:10rem}.form-control-flush{padding:0;background:none!important;border-color:transparent!important;resize:none;box-shadow:none!important;line-height:inherit}.form-footer{margin-top:2rem}.form-fieldset{padding:1rem;margin-bottom:1rem;background:var(--tblr-bg-surface-secondary);border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);border-radius:var(--tblr-border-radius)}fieldset:empty{display:none}.form-help{display:inline-flex;font-weight:var(--tblr-font-weight-bold);align-items:center;justify-content:center;width:1.125rem;height:1.125rem;font-size:.75rem;color:var(--tblr-secondary);text-align:center;text-decoration:none;cursor:pointer;user-select:none;background:var(--tblr-gray-100);border-radius:100rem;transition:background-color .3s,color .3s}@media(prefers-reduced-motion:reduce){.form-help{transition:none}}.form-help:hover,.form-help[aria-describedby]{color:#fff;background:var(--tblr-primary)}.input-group{box-shadow:var(--tblr-shadow-input);border-radius:var(--tblr-border-radius)}.input-group .form-control,.input-group .btn{box-shadow:none}.input-group-link{font-size:.75rem}.input-group-flat:focus-within{box-shadow:0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25);border-radius:var(--tblr-border-radius)}.input-group-flat:focus-within .form-control,.input-group-flat:focus-within .input-group-text{border-color:#80c2be!important}.input-group-flat .form-control:focus{border-color:var(--tblr-border-color);box-shadow:none}.input-group-flat .form-control:not(:last-child){border-right:0}.input-group-flat .form-control:not(:first-child){border-left:0}.input-group-flat .input-group-text{background:var(--tblr-bg-forms);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.input-group-flat .input-group-text{transition:none}}.input-group-flat .input-group-text:first-child{padding-right:0}.input-group-flat .input-group-text:last-child{padding-left:0}.form-file-button{margin-left:0;border-left:0}label[for=floating-input]{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media(max-width:575.98px){.form-control,.form-select{font-size:1rem}}.input-icon{position:relative}.input-icon .form-control:not(:last-child),.input-icon .form-select:not(:last-child){padding-right:2.5rem}.input-icon .form-control:not(:first-child),.input-icon .form-select:not(:last-child){padding-left:2.5rem}.input-icon-addon{position:absolute;top:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;min-width:2.5rem;color:var(--tblr-icon-color);pointer-events:none;font-size:1.2em}.input-icon-addon:last-child{right:0;left:auto}.form-colorinput{position:relative;display:inline-block;margin:0;line-height:1;cursor:pointer}.form-colorinput-input{position:absolute;z-index:-1;opacity:0}.form-colorinput-color{display:block;width:1.5rem;height:1.5rem;color:#fff;border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent);border-radius:var(--tblr-border-radius);box-shadow:0 1px 2px #0000000d}.form-colorinput-color:before{position:absolute;top:0;left:0;width:100%;height:100%;content:"";background:no-repeat center center/1.25rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' width='16' height='16'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8.5l2.5 2.5l5.5 -5.5'/%3e%3c/svg%3e");opacity:0;transition:opacity .3s}@media(prefers-reduced-motion:reduce){.form-colorinput-color:before{transition:none}}.form-colorinput-input:checked~.form-colorinput-color:before{opacity:1}.form-colorinput-input:focus~.form-colorinput-color{border-color:var(--tblr-primary);box-shadow:0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.form-colorinput-light .form-colorinput-color:before{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' width='16' height='16'%3e%3cpath fill='none' stroke='%231f2937' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8.5l2.5 2.5l5.5 -5.5'/%3e%3c/svg%3e")}.form-imagecheck{--tblr-form-imagecheck-radius: var(--tblr-border-radius);position:relative;margin:0;cursor:pointer}.form-imagecheck-input{position:absolute;z-index:-1;opacity:0}.form-imagecheck-figure{position:relative;display:block;margin:0;user-select:none;border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);border-radius:var(--tblr-form-imagecheck-radius)}.form-imagecheck-input:focus~.form-imagecheck-figure{border-color:var(--tblr-primary);box-shadow:0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.form-imagecheck-input:checked~.form-imagecheck-figure{border-color:var(--tblr-primary)}.form-imagecheck-figure:before{position:absolute;top:.25rem;left:.25rem;z-index:1;display:block;width:1.25rem;height:1.25rem;color:#fff;pointer-events:none;content:"";user-select:none;background:var(--tblr-bg-forms);border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);border-radius:var(--tblr-border-radius);transition:opacity .3s}@media(prefers-reduced-motion:reduce){.form-imagecheck-figure:before{transition:none}}.form-imagecheck-input:checked~.form-imagecheck-figure:before{background-color:var(--tblr-primary);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' width='16' height='16'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8.5l2.5 2.5l5.5 -5.5'/%3e%3c/svg%3e");background-repeat:repeat;background-position:center;background-size:1.25rem;border-color:var(--tblr-border-color-translucent)}.form-imagecheck-input[type=radio]~.form-imagecheck-figure:before{border-radius:50%}.form-imagecheck-input[type=radio]:checked~.form-imagecheck-figure:before{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3ccircle r='3' fill='%23ffffff' cx='8' cy='8' /%3e%3c/svg%3e")}.form-imagecheck-image{max-width:100%;display:block;opacity:.64;transition:opacity .3s}@media(prefers-reduced-motion:reduce){.form-imagecheck-image{transition:none}}.form-imagecheck-image:first-child{border-top-left-radius:calc(var(--tblr-form-imagecheck-radius) - 1px);border-top-right-radius:calc(var(--tblr-form-imagecheck-radius) - 1px)}.form-imagecheck-image:last-child{border-bottom-right-radius:calc(var(--tblr-form-imagecheck-radius) - 1px);border-bottom-left-radius:calc(var(--tblr-form-imagecheck-radius) - 1px)}.form-imagecheck:hover .form-imagecheck-image,.form-imagecheck-input:focus~.form-imagecheck-figure .form-imagecheck-image,.form-imagecheck-input:checked~.form-imagecheck-figure .form-imagecheck-image{opacity:1}.form-imagecheck-caption{padding:.25rem;font-size:.765625rem;color:var(--tblr-secondary);text-align:center;transition:color .3s}@media(prefers-reduced-motion:reduce){.form-imagecheck-caption{transition:none}}.form-imagecheck:hover .form-imagecheck-caption,.form-imagecheck-input:focus~.form-imagecheck-figure .form-imagecheck-caption,.form-imagecheck-input:checked~.form-imagecheck-figure .form-imagecheck-caption{color:var(--tblr-body-color)}.form-selectgroup{display:inline-flex;margin:0 -.5rem -.5rem 0;flex-wrap:wrap}.form-selectgroup .form-selectgroup-item{margin:0 .5rem .5rem 0}.form-selectgroup-vertical{flex-direction:column}.form-selectgroup-item{display:block;position:relative}.form-selectgroup-input{position:absolute;top:0;left:0;z-index:-1;opacity:0}.form-selectgroup-label{position:relative;display:block;min-width:calc(1.25rem + 1.125rem + calc(var(--tblr-border-width) * 2));margin:0;padding:.5625rem 1rem;font-size:.875rem;line-height:1.25rem;color:var(--tblr-secondary);background:var(--tblr-bg-forms);text-align:center;cursor:pointer;user-select:none;border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);border-radius:var(--tblr-border-radius);box-shadow:var(--tblr-shadow-input);transition:border-color .3s,background .3s,color .3s}@media(prefers-reduced-motion:reduce){.form-selectgroup-label{transition:none}}.form-selectgroup-label .icon:only-child{margin:0 -.25rem}.form-selectgroup-label:hover{color:var(--tblr-body-color)}.form-selectgroup-check{display:inline-block;width:1.25rem;height:1.25rem;border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent);vertical-align:middle;box-shadow:var(--tblr-shadow-input)}.form-selectgroup-input[type=checkbox]+.form-selectgroup-label .form-selectgroup-check{border-radius:var(--tblr-border-radius)}.form-selectgroup-input[type=radio]+.form-selectgroup-label .form-selectgroup-check{border-radius:50%}.form-selectgroup-input:checked+.form-selectgroup-label .form-selectgroup-check{background-color:var(--tblr-primary);background-repeat:repeat;background-position:center;background-size:1.25rem;border-color:var(--tblr-border-color-translucent)}.form-selectgroup-input[type=checkbox]:checked+.form-selectgroup-label .form-selectgroup-check{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' width='16' height='16'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8.5l2.5 2.5l5.5 -5.5'/%3e%3c/svg%3e")}.form-selectgroup-input[type=radio]:checked+.form-selectgroup-label .form-selectgroup-check{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3ccircle r='3' fill='%23ffffff' cx='8' cy='8' /%3e%3c/svg%3e")}.form-selectgroup-check-floated{position:absolute;top:.5625rem;right:.5625rem}.form-selectgroup-input:checked+.form-selectgroup-label{z-index:1;color:var(--tblr-primary);background:rgba(var(--tblr-primary-rgb),.04);border-color:var(--tblr-primary)}.form-selectgroup-input:focus+.form-selectgroup-label{z-index:2;color:var(--tblr-primary);border-color:var(--tblr-primary);box-shadow:0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.form-selectgroup-boxes .form-selectgroup-label{text-align:left;padding:1.25rem 1rem;color:inherit}.form-selectgroup-boxes .form-selectgroup-input:checked+.form-selectgroup-label{color:inherit}.form-selectgroup-boxes .form-selectgroup-input:checked+.form-selectgroup-label .form-selectgroup-title{color:var(--tblr-primary)}.form-selectgroup-boxes .form-selectgroup-input:checked+.form-selectgroup-label .form-selectgroup-label-content{opacity:1}.form-selectgroup-pills{flex-wrap:wrap;align-items:flex-start}.form-selectgroup-pills .form-selectgroup-item{flex-grow:0}.form-selectgroup-pills .form-selectgroup-label{border-radius:50px}.form-control-color::-webkit-color-swatch{border:none}[type=search]::-webkit-search-cancel-button{-webkit-appearance:none}.form-control::file-selector-button{background-color:var(--tblr-btn-color, var(--tblr-tertiary-bg))}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:var(--tblr-btn-color, var(--tblr-secondary-bg))}.form-check{user-select:none}.form-check.form-check-highlight .form-check-input:not(:checked)~.form-check-label{color:var(--tblr-secondary)}.form-check .form-check-label-off{color:var(--tblr-secondary)}.form-check .form-check-input:checked~.form-check-label-off{display:none}.form-check .form-check-input:not(:checked)~.form-check-label-on{display:none}.form-check-input{background-size:1.25rem;margin-top:0rem;box-shadow:var(--tblr-shadow-input)}.form-switch .form-check-input{transition:background-color .3s,background-position .3s}@media(prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-check-label{display:block}.form-check-label.required:after{content:"*";margin-left:.25rem;color:#d63939}.form-check-description{display:block;color:var(--tblr-secondary);font-size:.75rem;margin-top:.25rem}.form-check-single,.form-check-single .form-check-input{margin:0}.form-switch .form-check-input{height:1.25rem;margin-top:0rem}.form-switch-lg{padding-left:3.5rem;min-height:1.5rem}.form-switch-lg .form-check-input{height:1.5rem;width:2.75rem;background-size:1.5rem;margin-left:-3.5rem}.form-switch-lg .form-check-label{padding-top:.125rem}.form-check-input:checked{border:none}.form-select.is-invalid-lite,.form-control.is-invalid-lite,.form-select.is-valid-lite,.form-control.is-valid-lite{border-color:var(--tblr-border-color)!important}.legend{--tblr-legend-size: .75em;display:inline-block;background:var(--tblr-border-color);width:var(--tblr-legend-size);height:var(--tblr-legend-size);border-radius:var(--tblr-border-radius-sm);border:1px solid var(--tblr-border-color-translucent)}.list-group{margin-left:0;margin-right:0}.list-group-header{background:var(--tblr-bg-surface-tertiary);padding:.5rem 1.25rem;font-size:.75rem;font-weight:var(--tblr-font-weight-medium);line-height:1;text-transform:uppercase;color:var(--tblr-gray-500);border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.list-group-flush>.list-group-header:last-child{border-bottom-width:0}.list-group-item{background-color:inherit}.list-group-item.active{background-color:rgba(var(--tblr-secondary-rgb),.08);border-left-color:#00857d;border-left-width:2px}.list-group-item.disabled,.list-group-item:disabled{color:#6b7280;background-color:rgba(var(--tblr-secondary-rgb),.08)}.list-bordered .list-item{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);margin-top:-1px}.list-bordered .list-item:first-child{border-top:none}.list-group-hoverable .list-group-item:active,.list-group-hoverable .list-group-item:focus,.list-group-hoverable .list-group-item:hover{background-color:rgba(var(--tblr-secondary-rgb),.08)}.list-group-hoverable .list-group-item-actions{opacity:0;transition:opacity .3s}@media(prefers-reduced-motion:reduce){.list-group-hoverable .list-group-item-actions{transition:none}}.list-group-hoverable .list-group-item:hover .list-group-item-actions,.list-group-hoverable .list-group-item-actions.show{opacity:1}.list-group-transparent{--tblr-list-group-border-radius: 0;margin:0 -1.25rem}.list-group-transparent .list-group-item{background:none;border:0}.list-group-transparent .list-group-item .icon{color:var(--tblr-secondary)}.list-group-transparent .list-group-item.active{font-weight:var(--tblr-font-weight-bold);color:inherit;background:var(--tblr-active-bg)}.list-group-transparent .list-group-item.active .icon{color:inherit}.list-separated{display:flex;flex-direction:column;gap:1rem}.list-inline{margin:0}.list-inline-item:not(:last-child){margin-right:auto;margin-inline-end:.5rem}.list-inline-dots .list-inline-item+.list-inline-item:before{content:" \b7 ";margin-inline-end:.5rem}.loader{position:relative;display:block;width:2.5rem;height:2.5rem;color:#066fd1;vertical-align:middle}.loader:after{position:absolute;top:0;left:0;width:100%;height:100%;content:"";border:1px var(--tblr-border-style);border-color:transparent;border-top-color:currentColor;border-left-color:currentColor;border-radius:100rem;animation:rotate-360 .6s linear;animation-iteration-count:infinite}.dimmer{position:relative}.dimmer .loader{position:absolute;top:50%;right:0;left:0;display:none;margin:0 auto;transform:translateY(-50%)}.dimmer.active .loader{display:block}.dimmer.active .dimmer-content{pointer-events:none;opacity:.1}@keyframes animated-dots{0%{transform:translate(-100%)}}.animated-dots{display:inline-block;overflow:hidden;vertical-align:bottom}.animated-dots:after{display:inline-block;content:"...";animation:animated-dots 1.2s steps(4,jump-none) infinite}.modal-content>.btn-close,.modal-header>.btn-close{position:absolute;top:0;right:0;width:3.5rem;height:3.5rem;margin:0;padding:0;z-index:10}.modal-body{scrollbar-color:color-mix(in srgb,var(--tblr-scrollbar-color, var(--tblr-body-color)) 20%,transparent) transparent}.modal-body::-webkit-scrollbar{width:1rem;height:1rem;transition:background .3s}@media(prefers-reduced-motion:reduce){.modal-body::-webkit-scrollbar{transition:none}}.modal-body::-webkit-scrollbar-thumb{border-radius:1rem;border:5px solid transparent;box-shadow:inset 0 0 0 1rem color-mix(in srgb,var(--tblr-scrollbar-color, var(--tblr-body-color)) 20%,transparent)}.modal-body::-webkit-scrollbar-track{background:transparent}.modal-body:hover::-webkit-scrollbar-thumb{box-shadow:inset 0 0 0 1rem color-mix(in srgb,var(--tblr-scrollbar-color, var(--tblr-body-color)) 40%,transparent)}.modal-body::-webkit-scrollbar-corner{background:transparent}.modal-body .modal-title{margin-bottom:1rem}.modal-body+.modal-body{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.modal-status{position:absolute;top:0;left:0;right:0;height:2px;background:var(--tblr-secondary);border-radius:var(--tblr-border-radius-lg) var(--tblr-border-radius-lg) 0 0}.modal-header{align-items:center;min-height:3.5rem;background:transparent;padding:0 3.5rem 0 1.5rem}.modal-title{font-size:1rem;font-weight:var(--tblr-font-weight-bold);color:inherit;line-height:1.4285714286}.modal-footer{padding-top:.75rem;padding-bottom:.75rem}.modal-blur{backdrop-filter:blur(4px)}.modal-full-width{max-width:none;margin:0 .5rem}.nav{--tblr-nav-link-hover-bg: color-mix(in srgb, var(--tblr-nav-link-color) 4%, transparent)}.nav-vertical,.nav-vertical .nav{flex-direction:column;flex-wrap:nowrap}.nav-vertical .nav{margin-left:1.25rem;border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);padding-left:.5rem}.nav-vertical .nav-link.active,.nav-vertical .nav-item.show .nav-link{font-weight:var(--tblr-font-weight-bold);color:var(--tblr-nav-link-active-color)}.nav-vertical.nav-pills{margin:0 -.75rem}.nav-bordered{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.nav-bordered .nav-item+.nav-item{margin-left:1.25rem}.nav-bordered .nav-link{padding-left:0;padding-right:0;margin:0 0 calc(-1 * var(--tblr-border-width));border:0;border-bottom:2px var(--tblr-border-style) transparent}.nav-bordered .nav-link:hover{background-color:transparent}.nav-bordered .nav-link.active,.nav-bordered .nav-item.show .nav-link{color:var(--tblr-primary);border-color:var(--tblr-primary)}.nav-underline .nav-link{border-radius:0}.nav-link{display:flex;transition:color .3s,background-color .3s}@media(prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link{align-items:center}.nav-link:hover,.nav-link:focus{background-color:var(--tblr-nav-link-hover-bg)}.nav-link-toggle{margin-left:auto;padding:0 .25rem;transition:transform .3s}@media(prefers-reduced-motion:reduce){.nav-link-toggle{transition:none}}.nav-link-toggle:after{content:"";display:inline-block;vertical-align:.306em;width:.36em;height:.36em;border-bottom:1px var(--tblr-border-style);border-left:1px var(--tblr-border-style);margin-right:.1em;margin-left:.4em;transform:rotate(-45deg)}.nav-link-toggle:after{margin:0}.nav-link[aria-expanded=true] .nav-link-toggle{transform:rotate(180deg)}.nav-link-icon{width:1.25rem;height:1.25rem;margin-right:.5rem;color:inherit}.nav-link-icon svg{display:block;height:100%}.nav-fill .nav-item .nav-link{justify-content:center}.stars{display:inline-flex;color:#9ca3af;font-size:.75rem}.stars .star:not(:first-child){margin-left:.25rem}.pagination{margin:0;--tblr-pagination-gap: .25rem;user-select:none;gap:var(--tblr-pagination-gap);line-height:var(--tblr-body-line-height)}.page-link{min-width:2rem;border-radius:var(--tblr-pagination-border-radius)}.page-item:not(.active) .page-link:hover{background:var(--tblr-pagination-hover-bg)}.page-text{padding-left:.5rem;padding-right:.5rem}.page-item{text-align:center}.page-item.page-prev,.page-item.page-next{flex:0 0 50%;text-align:left}.page-item.page-next{margin-left:auto;text-align:right}.page-item-subtitle{margin-bottom:2px;font-size:12px;color:var(--tblr-secondary);text-transform:uppercase}.page-item.disabled .page-item-subtitle{color:var(--tblr-disabled-color)}.page-item-title{font-size:1rem;font-weight:var(--tblr-font-weight-normal);color:var(--tblr-body-color)}.page-link:hover .page-item-title{color:#00857d}.page-item.disabled .page-item-title{color:var(--tblr-disabled-color)}.pagination-outline{--tblr-pagination-border-color: var(--tblr-border-color);--tblr-pagination-disabled-border-color: var(--tblr-border-color);--tblr-pagination-border-width: 1px}.pagination-circle{--tblr-pagination-border-radius: var(--tblr-border-radius-pill)}@keyframes progress-indeterminate{0%{right:100%;left:-35%}to,60%{right:-90%;left:100%}}.progress{position:relative;width:100%;line-height:.5rem;appearance:none}.progress::-webkit-progress-bar{background:var(--tblr-progress-bg)}.progress::-webkit-progress-value{background-color:var(--tblr-primary)}.progress::-moz-progress-bar{background-color:var(--tblr-primary)}.progress::-ms-fill{background-color:var(--tblr-primary);border:none}.progress-sm{height:.25rem}.progress-bar{height:100%}.progress-bar-indeterminate:after,.progress-bar-indeterminate:before{position:absolute;top:0;bottom:0;left:0;content:"";background-color:inherit;will-change:left,right}.progress-bar-indeterminate:before{animation:progress-indeterminate 1.5s cubic-bezier(.65,.815,.735,.395) infinite}.progress-separated .progress-bar{box-shadow:0 0 0 2px var(--tblr-card-bg, var(--tblr-bg-surface))}.progressbg{position:relative;padding:.25rem .5rem;display:flex}.progressbg-text{position:relative;z-index:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.progressbg-progress{position:absolute;inset:0;z-index:0;height:100%;background:transparent;pointer-events:none}.progressbg-value{font-weight:var(--tblr-font-weight-medium);margin-left:auto;padding-left:2rem}.ribbon{--tblr-ribbon-margin: .25rem;--tblr-ribbon-border-radius: var(--tblr-border-radius);position:absolute;top:.75rem;right:calc(-1 * var(--tblr-ribbon-margin));z-index:1;padding:.25rem .75rem;font-size:.625rem;font-weight:var(--tblr-font-weight-bold);line-height:1;color:#fff;text-align:center;text-transform:uppercase;background:var(--tblr-primary);border-color:var(--tblr-primary);border-radius:var(--tblr-ribbon-border-radius) 0 var(--tblr-ribbon-border-radius) var(--tblr-ribbon-border-radius);display:inline-flex;align-items:center;justify-content:center;min-height:2rem;min-width:2rem}.ribbon:before{position:absolute;right:0;bottom:100%;width:0;height:0;content:"";filter:brightness(70%);border:calc(var(--tblr-ribbon-margin) * .5) var(--tblr-border-style);border-color:inherit;border-top-color:transparent;border-right-color:transparent}.ribbon.bg-blue{border-color:var(--tblr-blue)}.ribbon.bg-blue-lt{border-color:rgba(var(--tblr-blue-rgb),.1)!important}.ribbon.bg-azure{border-color:var(--tblr-azure)}.ribbon.bg-azure-lt{border-color:rgba(var(--tblr-azure-rgb),.1)!important}.ribbon.bg-indigo{border-color:var(--tblr-indigo)}.ribbon.bg-indigo-lt{border-color:rgba(var(--tblr-indigo-rgb),.1)!important}.ribbon.bg-purple{border-color:var(--tblr-purple)}.ribbon.bg-purple-lt{border-color:rgba(var(--tblr-purple-rgb),.1)!important}.ribbon.bg-pink{border-color:var(--tblr-pink)}.ribbon.bg-pink-lt{border-color:rgba(var(--tblr-pink-rgb),.1)!important}.ribbon.bg-red{border-color:var(--tblr-red)}.ribbon.bg-red-lt{border-color:rgba(var(--tblr-red-rgb),.1)!important}.ribbon.bg-orange{border-color:var(--tblr-orange)}.ribbon.bg-orange-lt{border-color:rgba(var(--tblr-orange-rgb),.1)!important}.ribbon.bg-yellow{border-color:var(--tblr-yellow)}.ribbon.bg-yellow-lt{border-color:rgba(var(--tblr-yellow-rgb),.1)!important}.ribbon.bg-lime{border-color:var(--tblr-lime)}.ribbon.bg-lime-lt{border-color:rgba(var(--tblr-lime-rgb),.1)!important}.ribbon.bg-green{border-color:var(--tblr-green)}.ribbon.bg-green-lt{border-color:rgba(var(--tblr-green-rgb),.1)!important}.ribbon.bg-teal{border-color:var(--tblr-teal)}.ribbon.bg-teal-lt{border-color:rgba(var(--tblr-teal-rgb),.1)!important}.ribbon.bg-cyan{border-color:var(--tblr-cyan)}.ribbon.bg-cyan-lt{border-color:rgba(var(--tblr-cyan-rgb),.1)!important}.ribbon .icon{width:1.25rem;height:1.25rem;font-size:1.25rem}.ribbon-top{top:calc(-1 * var(--tblr-ribbon-margin));right:.75rem;width:2rem;padding:.5rem 0;border-radius:0 var(--tblr-ribbon-border-radius) var(--tblr-ribbon-border-radius) var(--tblr-ribbon-border-radius)}.ribbon-top:before{top:0;right:100%;bottom:auto;border-color:inherit;border-top-color:transparent;border-left-color:transparent}.ribbon-top.ribbon-start{right:auto;left:.75rem}.ribbon-top.ribbon-start:before{top:0;right:100%;left:auto}.ribbon-start{right:auto;left:calc(-1 * var(--tblr-ribbon-margin));border-radius:0 var(--tblr-ribbon-border-radius) var(--tblr-ribbon-border-radius) var(--tblr-ribbon-border-radius)}.ribbon-start:before{top:auto;bottom:100%;left:0;border-color:inherit;border-top-color:transparent;border-left-color:transparent}.ribbon-bottom{top:auto;bottom:.75rem}.ribbon-bookmark{padding-left:.25rem;border-radius:0 0 var(--tblr-ribbon-border-radius) 0}.ribbon-bookmark:after{position:absolute;top:0;right:100%;display:block;width:0;height:0;content:"";border:1rem var(--tblr-border-style);border-color:inherit;border-right-width:0;border-left-color:transparent;border-left-width:.5rem}.ribbon-bookmark.ribbon-left{padding-right:.5rem}.ribbon-bookmark.ribbon-left:after{right:auto;left:100%;border-right-color:transparent;border-right-width:.5rem;border-left-width:0}.ribbon-bookmark.ribbon-top{padding-right:0;padding-bottom:.25rem;padding-left:0;border-radius:0 var(--tblr-ribbon-border-radius) 0 0}.ribbon-bookmark.ribbon-top:after{top:100%;right:0;left:0;border-color:inherit;border-width:1rem;border-top-width:0;border-bottom-color:transparent;border-bottom-width:.5rem}.markdown{line-height:2}.markdown>:first-child{margin-top:0}.markdown>:last-child,.markdown>:last-child .highlight{margin-bottom:0}@media(min-width:768px){.markdown>hr,.markdown>.hr{margin-top:3em;margin-bottom:3em}}.markdown>h1,.markdown>.h1,.markdown>h2,.markdown>.h2,.markdown>h3,.markdown>.h3,.markdown>h4,.markdown>.h4,.markdown>h5,.markdown>.h5,.markdown>h6,.markdown>.h6{font-weight:var(--tblr-font-weight-bold)}.markdown>h2,.markdown>.h2,.markdown>h3,.markdown>.h3,.markdown>h4,.markdown>.h4,.markdown>h5,.markdown>.h5,.markdown>h6,.markdown>.h6{margin-top:2.5rem}.markdown>table{font-size:var(--tblr-body-font-size)}.markdown>blockquote{font-size:1rem;margin:1.5rem 0;padding:.5rem 1.5rem}.markdown>img,.markdown>p>img{border-radius:var(--tblr-border-radius);border:1px solid var(--tblr-border-color)}.markdown pre{max-height:20rem}.placeholder:not(.btn):not([class*=bg-]){background-color:currentColor!important}.placeholder:not(.avatar):not([class*=card-img-]){border-radius:var(--tblr-border-radius)}.nav-segmented{--tblr-nav-bg: var(--tblr-bg-surface-tertiary);--tblr-nav-padding: 2px;--tblr-nav-height: 2.5rem;--tblr-nav-gap: .25rem;--tblr-nav-active-bg: var(--tblr-bg-surface);--tblr-nav-font-size: inherit;--tblr-nav-radius: 6px;--tblr-nav-link-disabled-color: var(--tblr-disabled-color);--tblr-nav-link-gap: .25rem;--tblr-nav-link-padding-x: .75rem;--tblr-nav-link-icon-size: 1.25rem;display:inline-flex;flex-wrap:wrap;gap:var(--tblr-nav-gap);padding:var(--tblr-nav-padding);list-style:none;background:var(--tblr-nav-bg);border-radius:calc(var(--tblr-nav-radius) + var(--tblr-nav-padding));box-shadow:inset 0 0 0 1px #0000000a}.nav-segmented .nav-link{display:inline-flex;gap:calc(.25rem + var(--tblr-nav-link-gap));align-items:center;margin:0;font-size:var(--tblr-nav-font-size);min-width:calc(var(--tblr-nav-height) - 2 * var(--tblr-nav-padding));height:calc(var(--tblr-nav-height) - 2 * var(--tblr-nav-padding));padding:0 calc(var(--tblr-nav-link-padding-x) - 2px);border:1px solid transparent;background:transparent;color:var(--tblr-secondary);text-align:center;text-decoration:none;white-space:nowrap;cursor:pointer;transition:background-color .3s,color .3s;border-radius:var(--tblr-nav-radius);flex-grow:1;justify-content:center}.nav-segmented .nav-link:hover,.nav-segmented .nav-link.hover{background:#0000000a;color:var(--tblr-body-color)}.nav-segmented .nav-link.disabled,.nav-segmented .nav-link:disabled{color:var(--tblr-nav-link-disabled-color);cursor:not-allowed}.nav-segmented .nav-link-input:checked+.nav-link,.nav-segmented .nav-link.active{color:var(--tblr-body-color);background:var(--tblr-nav-active-bg);border-color:var(--tblr-border-color)}.nav-segmented .nav-link-input{display:none}.nav-segmented .nav-link-icon{width:var(--tblr-nav-link-icon-size);height:var(--tblr-nav-link-icon-size);margin:0 -.25rem;color:inherit}.nav-segmented-vertical{flex-direction:column}.nav-segmented-vertical .nav-link{justify-content:flex-start}.nav-sm{--tblr-nav-height: 2rem;--tblr-nav-font-size: var(--tblr-font-size-h5);--tblr-nav-radius: 4px;--tblr-nav-link-padding-x: .5rem;--tblr-nav-link-gap: .25rem;--tblr-nav-link-icon-size: 1rem}.nav-lg{--tblr-nav-height: 3rem;--tblr-nav-font-size: var(--tblr-font-size-h3);--tblr-nav-radius: 8px;--tblr-nav-link-padding-x: 1rem;--tblr-nav-link-gap: .5rem;--tblr-nav-link-icon-size: 1.5rem}.steps{--tblr-steps-color: var(--tblr-primary);--tblr-steps-inactive-color: var(--tblr-border-color);--tblr-steps-dot-size: .5rem;--tblr-steps-border-width: 2px;display:flex;flex-wrap:nowrap;width:100%;padding:0;margin:0;list-style:none}.steps-blue{--tblr-steps-color: var(--tblr-blue)}.steps-blue-lt{--tblr-steps-color: var(--tblr-blue-lt)}.steps-azure{--tblr-steps-color: var(--tblr-azure)}.steps-azure-lt{--tblr-steps-color: var(--tblr-azure-lt)}.steps-indigo{--tblr-steps-color: var(--tblr-indigo)}.steps-indigo-lt{--tblr-steps-color: var(--tblr-indigo-lt)}.steps-purple{--tblr-steps-color: var(--tblr-purple)}.steps-purple-lt{--tblr-steps-color: var(--tblr-purple-lt)}.steps-pink{--tblr-steps-color: var(--tblr-pink)}.steps-pink-lt{--tblr-steps-color: var(--tblr-pink-lt)}.steps-red{--tblr-steps-color: var(--tblr-red)}.steps-red-lt{--tblr-steps-color: var(--tblr-red-lt)}.steps-orange{--tblr-steps-color: var(--tblr-orange)}.steps-orange-lt{--tblr-steps-color: var(--tblr-orange-lt)}.steps-yellow{--tblr-steps-color: var(--tblr-yellow)}.steps-yellow-lt{--tblr-steps-color: var(--tblr-yellow-lt)}.steps-lime{--tblr-steps-color: var(--tblr-lime)}.steps-lime-lt{--tblr-steps-color: var(--tblr-lime-lt)}.steps-green{--tblr-steps-color: var(--tblr-green)}.steps-green-lt{--tblr-steps-color: var(--tblr-green-lt)}.steps-teal{--tblr-steps-color: var(--tblr-teal)}.steps-teal-lt{--tblr-steps-color: var(--tblr-teal-lt)}.steps-cyan{--tblr-steps-color: var(--tblr-cyan)}.steps-cyan-lt{--tblr-steps-color: var(--tblr-cyan-lt)}.step-item{position:relative;flex:1 1 0;min-height:1rem;margin-top:0;color:inherit;text-align:center;cursor:default;padding-top:calc(var(--tblr-steps-dot-size))}a.step-item{cursor:pointer}a.step-item:hover{color:inherit}.step-item:after,.step-item:before{background:var(--tblr-steps-color)}.step-item:not(:last-child):after{position:absolute;left:50%;width:100%;content:"";transform:translateY(-50%)}.step-item:after{top:calc(var(--tblr-steps-dot-size) * .5);height:var(--tblr-steps-border-width)}.step-item:before{content:"";position:absolute;top:0;left:50%;z-index:1;box-sizing:content-box;display:flex;align-items:center;justify-content:center;border-radius:100rem;transform:translate(-50%);color:var(--tblr-white);width:var(--tblr-steps-dot-size);height:var(--tblr-steps-dot-size)}.step-item.active{font-weight:var(--tblr-font-weight-bold)}.step-item.active:after{background:var(--tblr-steps-inactive-color)}.step-item.active~.step-item{color:var(--tblr-disabled-color)}.step-item.active~.step-item:after,.step-item.active~.step-item:before{background:var(--tblr-steps-inactive-color)}.steps-counter{--tblr-steps-dot-size: 1.5rem;counter-reset:steps}.steps-counter .step-item{counter-increment:steps}.steps-counter .step-item:before{content:counter(steps)}.steps-vertical{--tblr-steps-dot-offset: 6px;flex-direction:column}.steps-vertical.steps-counter{--tblr-steps-dot-offset: -2px}.steps-vertical .step-item{text-align:left;padding-top:0;padding-left:calc(var(--tblr-steps-dot-size) + 1rem);min-height:auto}.steps-vertical .step-item:not(:first-child){margin-top:1rem}.steps-vertical .step-item:before{top:var(--tblr-steps-dot-offset);left:0;transform:translate(0)}.steps-vertical .step-item:not(:last-child):after{position:absolute;content:"";transform:translate(-50%);top:var(--tblr-steps-dot-offset);left:calc(var(--tblr-steps-dot-size) * .5);width:var(--tblr-steps-border-width);height:calc(100% + 1rem)}@keyframes status-pulsate-main{40%{transform:scale(1.25)}60%{transform:scale(1.25)}}@keyframes status-pulsate-secondary{10%{transform:scale(1)}30%{transform:scale(3)}80%{transform:scale(3)}to{transform:scale(1)}}@keyframes status-pulsate-tertiary{25%{transform:scale(1)}80%{transform:scale(3);opacity:0}to{transform:scale(3);opacity:0}}.status{--tblr-status-height: 1.5rem;--tblr-status-color: #6b7280;--tblr-status-color-rgb: 107, 114, 128;display:inline-flex;align-items:center;height:var(--tblr-status-height);padding:.25rem .75rem;gap:.5rem;color:var(--tblr-status-color);background:rgba(var(--tblr-status-color-rgb),.1);font-size:.875rem;text-transform:none;letter-spacing:normal;border-radius:100rem;font-weight:var(--tblr-font-weight-medium);line-height:1;margin:0}.status .status-dot{background:var(--tblr-status-color)}.status .icon{font-size:1.25rem}.status-lite{border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)!important;background:transparent!important;color:var(--tblr-body-color)!important}.status-primary{--tblr-status-color: #00857D;--tblr-status-color-rgb: 0, 133, 125}.status-secondary{--tblr-status-color: #6b7280;--tblr-status-color-rgb: 107, 114, 128}.status-success{--tblr-status-color: #2fb344;--tblr-status-color-rgb: 47, 179, 68}.status-info{--tblr-status-color: #4299e1;--tblr-status-color-rgb: 66, 153, 225}.status-warning{--tblr-status-color: #f59f00;--tblr-status-color-rgb: 245, 159, 0}.status-danger{--tblr-status-color: #d63939;--tblr-status-color-rgb: 214, 57, 57}.status-light{--tblr-status-color: #f9fafb;--tblr-status-color-rgb: 249, 250, 251}.status-dark{--tblr-status-color: #1f2937;--tblr-status-color-rgb: 31, 41, 55}.status-muted{--tblr-status-color: #6b7280;--tblr-status-color-rgb: 107, 114, 128}.status-blue{--tblr-status-color: #066fd1;--tblr-status-color-rgb: 6, 111, 209}.status-azure{--tblr-status-color: #4299e1;--tblr-status-color-rgb: 66, 153, 225}.status-indigo{--tblr-status-color: #4263eb;--tblr-status-color-rgb: 66, 99, 235}.status-purple{--tblr-status-color: #ae3ec9;--tblr-status-color-rgb: 174, 62, 201}.status-pink{--tblr-status-color: #d6336c;--tblr-status-color-rgb: 214, 51, 108}.status-red{--tblr-status-color: #d63939;--tblr-status-color-rgb: 214, 57, 57}.status-orange{--tblr-status-color: #f76707;--tblr-status-color-rgb: 247, 103, 7}.status-yellow{--tblr-status-color: #f59f00;--tblr-status-color-rgb: 245, 159, 0}.status-lime{--tblr-status-color: #74b816;--tblr-status-color-rgb: 116, 184, 22}.status-green{--tblr-status-color: #2fb344;--tblr-status-color-rgb: 47, 179, 68}.status-teal{--tblr-status-color: #0ca678;--tblr-status-color-rgb: 12, 166, 120}.status-cyan{--tblr-status-color: #17a2b8;--tblr-status-color-rgb: 23, 162, 184}.status-dot{--tblr-status-dot-color: var(--tblr-status-color, #6b7280);--tblr-status-size: .5rem;position:relative;display:inline-block;width:var(--tblr-status-size);height:var(--tblr-status-size);background:var(--tblr-status-dot-color);border-radius:100rem}.status-dot-animated:before{content:"";position:absolute;inset:0;z-index:0;background:inherit;border-radius:inherit;opacity:.6;animation:1s linear 2s backwards infinite status-pulsate-tertiary}.status-indicator{--tblr-status-indicator-size: 2.5rem;--tblr-status-indicator-color: var(--tblr-status-color, #6b7280);display:block;position:relative;width:var(--tblr-status-indicator-size);height:var(--tblr-status-indicator-size)}.status-indicator-circle{--tblr-status-circle-size: .75rem;position:absolute;left:50%;top:50%;margin:calc(var(--tblr-status-circle-size) / -2) 0 0 calc(var(--tblr-status-circle-size) / -2);width:var(--tblr-status-circle-size);height:var(--tblr-status-circle-size);border-radius:100rem;background:var(--tblr-status-color)}.status-indicator-circle:nth-child(1){z-index:3}.status-indicator-circle:nth-child(2){z-index:2;opacity:.1}.status-indicator-circle:nth-child(3){z-index:1;opacity:.3}.status-indicator-animated .status-indicator-circle:nth-child(1){animation:2s linear 1s infinite backwards status-pulsate-main}.status-indicator-animated .status-indicator-circle:nth-child(2){animation:2s linear 1s infinite backwards status-pulsate-secondary}.status-indicator-animated .status-indicator-circle:nth-child(3){animation:2s linear 1s infinite backwards status-pulsate-tertiary}.switch-icon{display:inline-block;line-height:1;border:0;padding:0;background:transparent;width:1.25rem;height:1.25rem;vertical-align:bottom;position:relative;cursor:pointer}.switch-icon.disabled{pointer-events:none;opacity:.4}.switch-icon:focus{outline:none}.switch-icon svg{display:block;width:100%;height:100%}.switch-icon .switch-icon-a,.switch-icon .switch-icon-b{display:block;width:100%;height:100%}.switch-icon .switch-icon-a{opacity:1}.switch-icon .switch-icon-b{position:absolute;top:0;left:0;opacity:0}.switch-icon.active .switch-icon-a{opacity:0}.switch-icon.active .switch-icon-b{opacity:1}.switch-icon-fade .switch-icon-a,.switch-icon-fade .switch-icon-b{transition:opacity .5s}@media(prefers-reduced-motion:reduce){.switch-icon-fade .switch-icon-a,.switch-icon-fade .switch-icon-b{transition:none}}.switch-icon-scale .switch-icon-a,.switch-icon-scale .switch-icon-b{transition:opacity .5s,transform 0s .5s}@media(prefers-reduced-motion:reduce){.switch-icon-scale .switch-icon-a,.switch-icon-scale .switch-icon-b{transition:none}}.switch-icon-scale .switch-icon-b{transform:scale(1.5)}.switch-icon-scale.active .switch-icon-a,.switch-icon-scale.active .switch-icon-b{transition:opacity 0s,transform .5s}@media(prefers-reduced-motion:reduce){.switch-icon-scale.active .switch-icon-a,.switch-icon-scale.active .switch-icon-b{transition:none}}.switch-icon-scale.active .switch-icon-b{transform:scale(1)}.switch-icon-flip{perspective:10em}.switch-icon-flip .switch-icon-a,.switch-icon-flip .switch-icon-b{backface-visibility:hidden;transform-style:preserve-3d;transition:opacity 0s .2s,transform .4s ease-in-out}@media(prefers-reduced-motion:reduce){.switch-icon-flip .switch-icon-a,.switch-icon-flip .switch-icon-b{transition:none}}.switch-icon-flip .switch-icon-a{opacity:1;transform:rotateY(0)}.switch-icon-flip .switch-icon-b{opacity:1;transform:rotateY(-180deg)}.switch-icon-flip.active .switch-icon-a{opacity:1;transform:rotateY(180deg)}.switch-icon-flip.active .switch-icon-b{opacity:1;transform:rotateY(0)}.switch-icon-slide-up,.switch-icon-slide-left,.switch-icon-slide-start,.switch-icon-slide-right,.switch-icon-slide-end,.switch-icon-slide-down{overflow:hidden}.switch-icon-slide-up .switch-icon-a,.switch-icon-slide-up .switch-icon-b,.switch-icon-slide-left .switch-icon-a,.switch-icon-slide-left .switch-icon-b,.switch-icon-slide-start .switch-icon-a,.switch-icon-slide-start .switch-icon-b,.switch-icon-slide-right .switch-icon-a,.switch-icon-slide-right .switch-icon-b,.switch-icon-slide-end .switch-icon-a,.switch-icon-slide-end .switch-icon-b,.switch-icon-slide-down .switch-icon-a,.switch-icon-slide-down .switch-icon-b{transition:opacity .3s,transform .3s}@media(prefers-reduced-motion:reduce){.switch-icon-slide-up .switch-icon-a,.switch-icon-slide-up .switch-icon-b,.switch-icon-slide-left .switch-icon-a,.switch-icon-slide-left .switch-icon-b,.switch-icon-slide-start .switch-icon-a,.switch-icon-slide-start .switch-icon-b,.switch-icon-slide-right .switch-icon-a,.switch-icon-slide-right .switch-icon-b,.switch-icon-slide-end .switch-icon-a,.switch-icon-slide-end .switch-icon-b,.switch-icon-slide-down .switch-icon-a,.switch-icon-slide-down .switch-icon-b{transition:none}}.switch-icon-slide-up .switch-icon-a,.switch-icon-slide-left .switch-icon-a,.switch-icon-slide-start .switch-icon-a,.switch-icon-slide-right .switch-icon-a,.switch-icon-slide-end .switch-icon-a,.switch-icon-slide-down .switch-icon-a{transform:translateY(0)}.switch-icon-slide-up .switch-icon-b,.switch-icon-slide-left .switch-icon-b,.switch-icon-slide-start .switch-icon-b,.switch-icon-slide-right .switch-icon-b,.switch-icon-slide-end .switch-icon-b,.switch-icon-slide-down .switch-icon-b{transform:translateY(100%)}.switch-icon-slide-up.active .switch-icon-a,.switch-icon-slide-left.active .switch-icon-a,.switch-icon-slide-start.active .switch-icon-a,.switch-icon-slide-right.active .switch-icon-a,.switch-icon-slide-end.active .switch-icon-a,.switch-icon-slide-down.active .switch-icon-a{transform:translateY(-100%)}.switch-icon-slide-up.active .switch-icon-b,.switch-icon-slide-left.active .switch-icon-b,.switch-icon-slide-start.active .switch-icon-b,.switch-icon-slide-right.active .switch-icon-b,.switch-icon-slide-end.active .switch-icon-b,.switch-icon-slide-down.active .switch-icon-b{transform:translateY(0)}.switch-icon-slide-left .switch-icon-a,.switch-icon-slide-start .switch-icon-a{transform:translate(0)}.switch-icon-slide-left .switch-icon-b,.switch-icon-slide-start .switch-icon-b{transform:translate(100%)}.switch-icon-slide-left.active .switch-icon-a,.switch-icon-slide-start.active .switch-icon-a{transform:translate(-100%)}.switch-icon-slide-left.active .switch-icon-b,.switch-icon-slide-start.active .switch-icon-b,.switch-icon-slide-right .switch-icon-a,.switch-icon-slide-end .switch-icon-a{transform:translate(0)}.switch-icon-slide-right .switch-icon-b,.switch-icon-slide-end .switch-icon-b{transform:translate(-100%)}.switch-icon-slide-right.active .switch-icon-a,.switch-icon-slide-end.active .switch-icon-a{transform:translate(100%)}.switch-icon-slide-right.active .switch-icon-b,.switch-icon-slide-end.active .switch-icon-b{transform:translate(0)}.switch-icon-slide-down .switch-icon-a{transform:translateY(0)}.switch-icon-slide-down .switch-icon-b{transform:translateY(-100%)}.switch-icon-slide-down.active .switch-icon-a{transform:translateY(100%)}.switch-icon-slide-down.active .switch-icon-b{transform:translateY(0)}.table thead th,.markdown>table thead th{background:var(--tblr-bg-surface-tertiary);font-size:.75rem;font-weight:var(--tblr-font-weight-medium);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);padding-top:.5rem;padding-bottom:.5rem;white-space:nowrap}@media print{.table thead th,.markdown>table thead th{background:transparent}}.table-responsive .table,.table-responsive .markdown>table{margin-bottom:0}.table-responsive+.card-footer{border-top:0}.table-transparent thead th{background:transparent}.table-nowrap>:not(caption)>*>*{white-space:nowrap}.table-vcenter>:not(caption)>*>*{vertical-align:middle}.table-center>:not(caption)>*>*{text-align:center}.td-truncate{max-width:1px;width:100%}.table-mobile{display:block}.table-mobile thead{display:none}.table-mobile tbody,.table-mobile tr{display:flex;flex-direction:column}.table-mobile td{display:block;padding:.5rem!important;border:none;color:var(--tblr-body-color)!important}.table-mobile td[data-label]:before{font-size:.75rem;font-weight:var(--tblr-font-weight-medium);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);content:attr(data-label);display:block}.table-mobile tr{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)}.table-mobile .btn{display:block}@media(max-width:575.98px){.table-mobile-sm{display:block}.table-mobile-sm thead{display:none}.table-mobile-sm tbody,.table-mobile-sm tr{display:flex;flex-direction:column}.table-mobile-sm td{display:block;padding:.5rem!important;border:none;color:var(--tblr-body-color)!important}.table-mobile-sm td[data-label]:before{font-size:.75rem;font-weight:var(--tblr-font-weight-medium);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);content:attr(data-label);display:block}.table-mobile-sm tr{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)}.table-mobile-sm .btn{display:block}}@media(max-width:767.98px){.table-mobile-md{display:block}.table-mobile-md thead{display:none}.table-mobile-md tbody,.table-mobile-md tr{display:flex;flex-direction:column}.table-mobile-md td{display:block;padding:.5rem!important;border:none;color:var(--tblr-body-color)!important}.table-mobile-md td[data-label]:before{font-size:.75rem;font-weight:var(--tblr-font-weight-medium);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);content:attr(data-label);display:block}.table-mobile-md tr{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)}.table-mobile-md .btn{display:block}}@media(max-width:991.98px){.table-mobile-lg{display:block}.table-mobile-lg thead{display:none}.table-mobile-lg tbody,.table-mobile-lg tr{display:flex;flex-direction:column}.table-mobile-lg td{display:block;padding:.5rem!important;border:none;color:var(--tblr-body-color)!important}.table-mobile-lg td[data-label]:before{font-size:.75rem;font-weight:var(--tblr-font-weight-medium);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);content:attr(data-label);display:block}.table-mobile-lg tr{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)}.table-mobile-lg .btn{display:block}}@media(max-width:1199.98px){.table-mobile-xl{display:block}.table-mobile-xl thead{display:none}.table-mobile-xl tbody,.table-mobile-xl tr{display:flex;flex-direction:column}.table-mobile-xl td{display:block;padding:.5rem!important;border:none;color:var(--tblr-body-color)!important}.table-mobile-xl td[data-label]:before{font-size:.75rem;font-weight:var(--tblr-font-weight-medium);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);content:attr(data-label);display:block}.table-mobile-xl tr{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)}.table-mobile-xl .btn{display:block}}@media(max-width:1399.98px){.table-mobile-xxl{display:block}.table-mobile-xxl thead{display:none}.table-mobile-xxl tbody,.table-mobile-xxl tr{display:flex;flex-direction:column}.table-mobile-xxl td{display:block;padding:.5rem!important;border:none;color:var(--tblr-body-color)!important}.table-mobile-xxl td[data-label]:before{font-size:.75rem;font-weight:var(--tblr-font-weight-medium);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);content:attr(data-label);display:block}.table-mobile-xxl tr{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)}.table-mobile-xxl .btn{display:block}}.table-sort{font:inherit;color:inherit;text-transform:inherit;letter-spacing:inherit;border:0;background:inherit;display:block;width:100%;text-align:inherit;transition:color .3s}@media(prefers-reduced-motion:reduce){.table-sort{transition:none}}.table-sort{margin:-.5rem;padding:.5rem}.table-sort:hover,.table-sort.asc,.table-sort.desc{color:var(--tblr-body-color)}.table-sort:after{content:"";display:inline-flex;width:1rem;height:1rem;vertical-align:bottom;mask-image:url("data:image/svg+xml,");background:currentColor;margin-left:.25rem}.table-sort.asc:after{mask-image:url("data:image/svg+xml,")}.table-sort.desc:after{mask-image:url("data:image/svg+xml,")}.table-borderless thead th{background:transparent}.table-selectable tbody tr .on-checked{display:none}.table-selectable tbody tr .on-unchecked{display:initial}.table-selectable tbody tr:has(.table-selectable-check:checked){background-color:var(--tblr-active-bg)}.table-selectable tbody tr:has(.table-selectable-check:checked) .on-checked{display:initial}.table-selectable tbody tr:has(.table-selectable-check:checked) .on-unchecked{display:none}.tag{--tblr-tag-height: 1.5rem;border:1px solid var(--tblr-border-color);display:inline-flex;align-items:center;height:var(--tblr-tag-height);border-radius:var(--tblr-border-radius);padding:0 .5rem;background:var(--tblr-bg-surface);box-shadow:var(--tblr-shadow-input);gap:.5rem}.tag .btn-close{margin-right:-.25rem;margin-left:-.125rem;padding:0;width:1rem;height:1rem;font-size:.5rem}.tag-badge{--tblr-badge-font-size: .625rem;--tblr-badge-padding-x: .25rem;--tblr-badge-padding-y: .125rem;margin-right:-.25rem}.tag-avatar,.tag-flag,.tag-payment,.tag-icon,.tag-check{margin-left:-.25rem}.tag-icon{color:var(--tblr-secondary);margin-right:-.125rem;width:1rem;height:1rem}.tag-check{width:1rem;height:1rem;background-size:1rem}.tags-list{--tblr-list-gap: .5rem;display:flex;flex-wrap:wrap;gap:var(--tblr-list-gap)}.toast{border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent);box-shadow:#1f29370a 0 2px 4px}.toast .toast-header{user-select:none}.toast button[data-bs-dismiss=toast]{outline:none}.toast-primary{--tblr-toast-color: #00857D}.toast-secondary{--tblr-toast-color: #6b7280}.toast-success{--tblr-toast-color: #2fb344}.toast-info{--tblr-toast-color: #4299e1}.toast-warning{--tblr-toast-color: #f59f00}.toast-danger{--tblr-toast-color: #d63939}.toast-light{--tblr-toast-color: #f9fafb}.toast-dark{--tblr-toast-color: #1f2937}.toast-muted{--tblr-toast-color: #6b7280}.toast-blue{--tblr-toast-color: #066fd1}.toast-azure{--tblr-toast-color: #4299e1}.toast-indigo{--tblr-toast-color: #4263eb}.toast-purple{--tblr-toast-color: #ae3ec9}.toast-pink{--tblr-toast-color: #d6336c}.toast-red{--tblr-toast-color: #d63939}.toast-orange{--tblr-toast-color: #f76707}.toast-yellow{--tblr-toast-color: #f59f00}.toast-lime{--tblr-toast-color: #74b816}.toast-green{--tblr-toast-color: #2fb344}.toast-teal{--tblr-toast-color: #0ca678}.toast-cyan{--tblr-toast-color: #17a2b8}.toolbar{display:flex;flex-wrap:nowrap;flex-shrink:0;margin:0 -.5rem}.toolbar>*{margin:0 .5rem}.tracking{--tblr-tracking-height: 1.5rem;--tblr-tracking-gap-width: .125rem;--tblr-tracking-block-border-radius: var(--tblr-border-radius);display:flex;gap:var(--tblr-tracking-gap-width)}.tracking-squares{--tblr-tracking-block-border-radius: var(--tblr-border-radius-sm)}.tracking-squares .tracking-block{height:auto}.tracking-squares .tracking-block:before{content:"";display:block;padding-top:100%}.tracking-block{flex:1;border-radius:var(--tblr-tracking-block-border-radius);height:var(--tblr-tracking-height);min-width:.25rem;background:var(--tblr-border-color)}.timeline{--tblr-timeline-icon-size: 2.5rem;position:relative;list-style:none;padding:0}.timeline-event{position:relative}.timeline-event:not(:last-child){margin-bottom:var(--tblr-page-padding)}.timeline-event:not(:last-child):before{content:"";position:absolute;top:var(--tblr-timeline-icon-size);left:calc(var(--tblr-timeline-icon-size) / 2);bottom:calc(-1 * var(--tblr-page-padding));width:var(--tblr-border-width);background-color:var(--tblr-border-color);border-radius:var(--tblr-border-radius)}.timeline-event-icon{position:absolute;display:flex;align-items:center;justify-content:center;width:var(--tblr-timeline-icon-size, 2.5rem);height:var(--tblr-timeline-icon-size, 2.5rem);background:var(--tblr-bg-surface-secondary);color:var(--tblr-secondary);border-radius:var(--tblr-border-radius);z-index:5}.timeline-event-card{margin-left:calc(var(--tblr-timeline-icon-size, 2.5rem) + var(--tblr-page-padding))}.timeline-simple .timeline-event-icon{display:none}.timeline-simple .timeline-event-card{margin-left:0}.hr-text{display:flex;align-items:center;margin:2rem 0;font-size:.75rem;font-weight:var(--tblr-font-weight-medium);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);height:1px}.hr-text:after,.hr-text:before{flex:1 1 auto;height:1px;background-color:var(--tblr-border-color)}.hr-text:before{content:"";margin-right:.5rem}.hr-text:after{content:"";margin-left:.5rem}.hr-text>*:first-child{padding-right:.5rem;padding-left:0;color:var(--tblr-secondary)}.hr-text.hr-text-left:before,.hr-text.hr-text-start:before{content:none}.hr-text.hr-text-left>*:first-child,.hr-text.hr-text-start>*:first-child{padding-right:.5rem;padding-left:.5rem}.hr-text.hr-text-right:before,.hr-text.hr-text-end:before{content:""}.hr-text.hr-text-right:after,.hr-text.hr-text-end:after{content:none}.hr-text.hr-text-right>*:first-child,.hr-text.hr-text-end>*:first-child{padding-right:0;padding-left:.5rem}.card>.hr-text{margin:0}.hr-text-spaceless{margin:-.5rem 0}.lead{color:var(--tblr-secondary);font-size:inherit}a{text-decoration-skip-ink:auto;color:color-mix(in srgb,transparent,var(--tblr-link-color) var(--tblr-link-opacity, 100%))}a:hover{color:color-mix(in srgb,transparent,var(--tblr-link-hover-color) var(--tblr-link-opacity, 100%))}h1 a,h2 a,h3 a,.field-group h2 a,h4 a,h5 a,h6 a,.h1 a,.h2 a,.h3 a,.h4 a,.h5 a,.h6 a,h1 a:hover,h2 a:hover,h3 a:hover,h4 a:hover,h5 a:hover,h6 a:hover,.h1 a:hover,.h2 a:hover,.h3 a:hover,.h4 a:hover,.h5 a:hover,.h6 a:hover{color:inherit}h1,.h1{font-size:var(--tblr-font-size-h1);line-height:var(--tblr-line-height-h1)}h2,.h2{font-size:var(--tblr-font-size-h2);line-height:var(--tblr-line-height-h2)}h3,.field-group h2,.field-group .h2,.h3{font-size:var(--tblr-font-size-h3);line-height:var(--tblr-line-height-h3)}h4,.h4{font-size:var(--tblr-font-size-h4);line-height:var(--tblr-line-height-h4)}h5,.h5{font-size:var(--tblr-font-size-h5);line-height:var(--tblr-line-height-h5)}h6,.h6{font-size:var(--tblr-font-size-h6);line-height:var(--tblr-line-height-h6)}.fs-base{font-size:var(--tblr-body-font-size)}strong,.strong,b{font-weight:var(--tblr-font-weight-bold)}blockquote{padding:1rem;border-left:2px var(--tblr-border-style) var(--tblr-border-color)}blockquote p{margin-bottom:1rem}blockquote cite{display:block;text-align:right}blockquote cite:before{content:"\2014 "}ul,ol{padding-left:1.5rem}hr,.hr{margin:2rem 0}dl dd:last-child{margin-bottom:0}pre{--tblr-scrollbar-color: var(--tblr-light);padding:1rem;background:var(--tblr-bg-surface-dark);color:var(--tblr-light);border-radius:var(--tblr-border-radius);line-height:1.4285714286}pre{scrollbar-color:color-mix(in srgb,var(--tblr-scrollbar-color, var(--tblr-body-color)) 20%,transparent) transparent}pre::-webkit-scrollbar{width:1rem;height:1rem;transition:background .3s}@media(prefers-reduced-motion:reduce){pre::-webkit-scrollbar{transition:none}}pre::-webkit-scrollbar-thumb{border-radius:1rem;border:5px solid transparent;box-shadow:inset 0 0 0 1rem color-mix(in srgb,var(--tblr-scrollbar-color, var(--tblr-body-color)) 20%,transparent)}pre::-webkit-scrollbar-track{background:transparent}pre:hover::-webkit-scrollbar-thumb{box-shadow:inset 0 0 0 1rem color-mix(in srgb,var(--tblr-scrollbar-color, var(--tblr-body-color)) 40%,transparent)}pre::-webkit-scrollbar-corner{background:transparent}pre code{background:transparent;padding:0}code{background:var(--tblr-code-bg);padding:2px 4px;border-radius:var(--tblr-border-radius)}abbr{text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}kbd,.kbd{border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);display:inline-block;box-sizing:border-box;max-width:100%;font-size:var(--tblr-font-size-h5);font-weight:var(--tblr-font-weight-medium);line-height:1;vertical-align:baseline;border-radius:var(--tblr-border-radius)}img{max-width:100%;height:auto}.list-unstyled{margin-left:0}::selection,.text-selected{background-color:color-mix(in srgb,var(--tblr-primary) 10%,transparent)}.text-selected{display:inline-block}[class^=link-].disabled,[class*=" link-"].disabled{color:var(--tblr-disabled-color)!important;pointer-events:none}a:hover:has(.icon){text-decoration:none}.link-hoverable{border-radius:var(--tblr-border-radius);transition:background-color .15s ease-in-out}.link-hoverable:hover{text-decoration:none;color:var(--tblr-primary);background:color-mix(in srgb,var(--tblr-secondary) 4%,transparent)}.subheader{font-size:.75rem;font-weight:var(--tblr-font-weight-medium);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary)}.mention{display:inline-block;box-shadow:var(--tblr-shadow-border);border-radius:var(--tblr-border-radius-pill);line-height:1.3333333333em;font-size:.8571428571em;color:var(--tblr-body-color);background:var(--tblr-bg-surface-tertiary);padding:.1666666667em .6666666667em;font-weight:var(--tblr-font-weight-medium)}a.mention{cursor:pointer}a.mention:hover,a.mention.hover{background:var(--tblr-bg-surface-secondary);text-decoration:underline}.mention-avatar,.mention-app,.mention-color{width:1.1666666667em;height:1.1666666667em;border-radius:var(--tblr-border-radius-pill);margin:-.1666666667em .3333333333em 0 -.3333333333em;display:inline-flex;background:no-repeat center center/cover;box-shadow:var(--tblr-shadow-border);vertical-align:middle;text-align:center}.mention-app{box-shadow:none;background:none;border-radius:0}.mention-count{color:var(--tblr-secondary);margin-left:.6666666667em}.text-incorrect{background:color-mix(in srgb,var(--tblr-red) 4%,transparent);text-decoration:underline;text-decoration-thickness:1px;text-decoration-color:var(--tblr-red)}.text-correct{background:color-mix(in srgb,var(--tblr-green) 4%,transparent);text-decoration:underline;text-decoration-thickness:1px;text-decoration-color:var(--tblr-green)}.steps{--tblr-steps-padding: 2rem;--tblr-steps-item-size: 1.5rem;margin-left:1rem;padding-left:var(--tblr-steps-padding);counter-reset:step;border-left:1px solid var(--tblr-border-color);margin-bottom:2rem}.steps h3,.steps .field-group h2,.field-group .steps h2,.steps .field-group .h2,.field-group .steps .h2,.steps .h3{counter-increment:step}.steps h3:not(:first-child),.steps .field-group h2:not(:first-child),.field-group .steps h2:not(:first-child),.steps .field-group .h2:not(:first-child),.field-group .steps .h2:not(:first-child),.steps .h3:not(:first-child){margin-top:2.5rem!important}.steps h3:before,.steps .field-group h2:before,.field-group .steps h2:before,.steps .field-group .h2:before,.field-group .steps .h2:before,.steps .h3:before{content:counter(step);display:inline-block;position:absolute;margin-top:1px;margin-left:calc(-1 * var(--tblr-steps-padding) - var(--tblr-steps-item-size) / 2);width:var(--tblr-steps-item-size);height:var(--tblr-steps-item-size);text-align:center;color:var(--tblr-body-color);border:1px solid var(--tblr-border-color);background:var(--tblr-bg-surface);border-radius:var(--tblr-border-radius);line-height:calc(var(--tblr-steps-item-size) - 2px);font-size:var(--tblr-font-size-h4);font-weight:var(--tblr-font-weight-bold)}.steps>:last-child{margin-bottom:0}.callout{margin-bottom:1.5rem;border:1px solid var(--tblr-primary-200);border-radius:var(--tblr-border-radius);padding:.5rem 1rem;background:var(--tblr-primary-lt)}.callout>:last-child{margin-bottom:0}.chart{display:block;min-height:10rem}.chart text{font-family:inherit}.chart-sm{height:2.5rem}.chart-lg{height:15rem}.chart-square{height:5.75rem}.chart-sparkline{position:relative;width:4rem;height:2.5rem;line-height:1;min-height:0!important}.chart-sparkline-sm{height:1.5rem}.chart-sparkline-square{width:2.5rem}.chart-sparkline-wide{width:6rem}.chart-sparkline-label{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font-size:.625rem}.chart-sparkline-label .icon{width:1rem;height:1rem;font-size:1rem}.offcanvas-header{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.offcanvas-footer{padding:1.5rem}.offcanvas-title{font-size:1rem;font-weight:var(--tblr-font-weight-medium);line-height:1.5rem}.offcanvas-narrow{width:20rem}.chat-bubbles{display:flex;flex-direction:column;gap:1rem}.chat-bubble{background:var(--tblr-bg-surface-secondary);border-radius:var(--tblr-border-radius-lg);padding:1rem;position:relative}.chat-bubble-me{background-color:var(--tblr-primary-lt);box-shadow:none}.chat-bubble-title{margin-bottom:.25rem}.chat-bubble-author{font-weight:600}.chat-bubble-date{color:var(--tblr-secondary)}.chat-bubble-body>*:last-child{margin-bottom:0}.signature{--tblr-signature-padding: var(--tblr-spacer-1);--tblr-signature-border-radius: var(--tblr-border-radius);border:var(--tblr-border-width) solid var(--tblr-border-color);padding:var(--tblr-signature-padding);border-radius:var(--tblr-border-radius)}.signature-canvas{border:var(--tblr-border-width) dashed var(--tblr-border-color);border-radius:calc(var(--tblr-signature-border-radius) - var(--tblr-signature-padding));display:block;cursor:crosshair;width:100%}.clearfix:after{display:block;clear:both;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:var(--tblr-border-width);min-height:1em;background-color:currentcolor;opacity:.16}.stretched-link:after{position:absolute;inset:0;z-index:1;content:""}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute!important}.visually-hidden *,.visually-hidden-focusable:not(:focus):not(:focus-within) *{overflow:hidden!important}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media(min-width:576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width:768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width:992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width:1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width:1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:sticky;bottom:0;z-index:1020}}.ratio{position:relative;width:100%}.ratio:before{display:block;padding-top:var(--tblr-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--tblr-aspect-ratio: 100%}.ratio-2x1{--tblr-aspect-ratio: 50%}.ratio-1x2{--tblr-aspect-ratio: 200%}.ratio-3x1{--tblr-aspect-ratio: 33.3333333333%}.ratio-1x3{--tblr-aspect-ratio: 300%}.ratio-4x1{--tblr-aspect-ratio: 25%}.ratio-1x4{--tblr-aspect-ratio: 400%}.ratio-4x3{--tblr-aspect-ratio: 75%}.ratio-3x4{--tblr-aspect-ratio: 133.3333333333%}.ratio-16x9{--tblr-aspect-ratio: 56.25%}.ratio-9x16{--tblr-aspect-ratio: 177.7777777778%}.ratio-21x9{--tblr-aspect-ratio: 42.8571428571%}.ratio-9x21{--tblr-aspect-ratio: 233.3333333333%}.focus-ring:focus{outline:0;box-shadow:var(--tblr-focus-ring-x, 0) var(--tblr-focus-ring-y, 0) var(--tblr-focus-ring-blur, 0) var(--tblr-focus-ring-width) var(--tblr-focus-ring-color)}.bg-white-overlay{color:#fff;background-color:#f9fafb3d}.bg-dark-overlay{color:#fff;background-color:#1f29373d}.bg-cover{background-repeat:no-repeat;background-size:cover;background-position:center}.bg-primary{background-color:color-mix(in srgb,var(--tblr-primary) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-primary-lt{color:color-mix(in srgb,var(--tblr-primary) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-primary-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-primary{border-color:color-mix(in srgb,var(--tblr-primary) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-primary{--tblr-gradient-from: var(--tblr-primary)}.bg-gradient-to-primary{--tblr-gradient-to: var(--tblr-primary)}.bg-gradient-via-primary{--tblr-gradient-via: var(--tblr-primary);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-primary{color:#f9fafb!important;background-color:RGBA(var(--tblr-primary-rgb),var(--tblr-bg-opacity, 1))!important}.link-primary{color:color-mix(in srgb,var(--tblr-primary) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-primary) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-primary:hover,.link-primary:focus{color:RGBA(0,106,100,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(0,106,100,var(--tblr-link-underline-opacity, 1))!important}.bg-secondary{background-color:color-mix(in srgb,var(--tblr-secondary) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-secondary-lt{color:color-mix(in srgb,var(--tblr-secondary) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-secondary-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-secondary{border-color:color-mix(in srgb,var(--tblr-secondary) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-secondary{--tblr-gradient-from: var(--tblr-secondary)}.bg-gradient-to-secondary{--tblr-gradient-to: var(--tblr-secondary)}.bg-gradient-via-secondary{--tblr-gradient-via: var(--tblr-secondary);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-secondary,.text-bg-gray{color:#f9fafb!important;background-color:RGBA(var(--tblr-secondary-rgb),var(--tblr-bg-opacity, 1))!important}.link-secondary{color:color-mix(in srgb,var(--tblr-secondary) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-secondary) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-secondary:hover,.link-secondary:focus{color:RGBA(86,91,102,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(86,91,102,var(--tblr-link-underline-opacity, 1))!important}.bg-success{background-color:color-mix(in srgb,var(--tblr-success) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-success-lt{color:color-mix(in srgb,var(--tblr-success) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-success-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-success{border-color:color-mix(in srgb,var(--tblr-success) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-success{--tblr-gradient-from: var(--tblr-success)}.bg-gradient-to-success{--tblr-gradient-to: var(--tblr-success)}.bg-gradient-via-success{--tblr-gradient-via: var(--tblr-success);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-success{color:#f9fafb!important;background-color:RGBA(var(--tblr-success-rgb),var(--tblr-bg-opacity, 1))!important}.link-success{color:color-mix(in srgb,var(--tblr-success) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-success) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-success:hover,.link-success:focus{color:RGBA(38,143,54,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(38,143,54,var(--tblr-link-underline-opacity, 1))!important}.bg-info{background-color:color-mix(in srgb,var(--tblr-info) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-info-lt{color:color-mix(in srgb,var(--tblr-info) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-info-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-info{border-color:color-mix(in srgb,var(--tblr-info) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-info{--tblr-gradient-from: var(--tblr-info)}.bg-gradient-to-info{--tblr-gradient-to: var(--tblr-info)}.bg-gradient-via-info{--tblr-gradient-via: var(--tblr-info);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-info{color:#f9fafb!important;background-color:RGBA(var(--tblr-info-rgb),var(--tblr-bg-opacity, 1))!important}.link-info{color:color-mix(in srgb,var(--tblr-info) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-info) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-info:hover,.link-info:focus{color:RGBA(53,122,180,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(53,122,180,var(--tblr-link-underline-opacity, 1))!important}.bg-warning{background-color:color-mix(in srgb,var(--tblr-warning) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-warning-lt{color:color-mix(in srgb,var(--tblr-warning) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-warning-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-warning{border-color:color-mix(in srgb,var(--tblr-warning) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-warning{--tblr-gradient-from: var(--tblr-warning)}.bg-gradient-to-warning{--tblr-gradient-to: var(--tblr-warning)}.bg-gradient-via-warning{--tblr-gradient-via: var(--tblr-warning);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-warning{color:#f9fafb!important;background-color:RGBA(var(--tblr-warning-rgb),var(--tblr-bg-opacity, 1))!important}.link-warning{color:color-mix(in srgb,var(--tblr-warning) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-warning) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-warning:hover,.link-warning:focus{color:RGBA(196,127,0,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(196,127,0,var(--tblr-link-underline-opacity, 1))!important}.bg-danger{background-color:color-mix(in srgb,var(--tblr-danger) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-danger-lt{color:color-mix(in srgb,var(--tblr-danger) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-danger-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-danger{border-color:color-mix(in srgb,var(--tblr-danger) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-danger{--tblr-gradient-from: var(--tblr-danger)}.bg-gradient-to-danger{--tblr-gradient-to: var(--tblr-danger)}.bg-gradient-via-danger{--tblr-gradient-via: var(--tblr-danger);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-danger{color:#f9fafb!important;background-color:RGBA(var(--tblr-danger-rgb),var(--tblr-bg-opacity, 1))!important}.link-danger{color:color-mix(in srgb,var(--tblr-danger) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-danger) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-danger:hover,.link-danger:focus{color:RGBA(171,46,46,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(171,46,46,var(--tblr-link-underline-opacity, 1))!important}.bg-light{background-color:color-mix(in srgb,var(--tblr-light) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-light-lt{color:color-mix(in srgb,var(--tblr-light) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-light-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-light{border-color:color-mix(in srgb,var(--tblr-light) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-light{--tblr-gradient-from: var(--tblr-light)}.bg-gradient-to-light{--tblr-gradient-to: var(--tblr-light)}.bg-gradient-via-light{--tblr-gradient-via: var(--tblr-light);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-light,.text-bg-white{color:#1f2937!important;background-color:RGBA(var(--tblr-light-rgb),var(--tblr-bg-opacity, 1))!important}.link-light{color:color-mix(in srgb,var(--tblr-light) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-light) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-light:hover,.link-light:focus{color:RGBA(250,251,252,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(250,251,252,var(--tblr-link-underline-opacity, 1))!important}.bg-dark{background-color:color-mix(in srgb,var(--tblr-dark) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-dark-lt{color:color-mix(in srgb,var(--tblr-dark) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-dark-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-dark{border-color:color-mix(in srgb,var(--tblr-dark) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-dark{--tblr-gradient-from: var(--tblr-dark)}.bg-gradient-to-dark{--tblr-gradient-to: var(--tblr-dark)}.bg-gradient-via-dark{--tblr-gradient-via: var(--tblr-dark);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-dark,.text-bg-black{color:#f9fafb!important;background-color:RGBA(var(--tblr-dark-rgb),var(--tblr-bg-opacity, 1))!important}.link-dark{color:color-mix(in srgb,var(--tblr-dark) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-dark) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-dark:hover,.link-dark:focus{color:RGBA(25,33,44,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(25,33,44,var(--tblr-link-underline-opacity, 1))!important}.bg-muted{background-color:color-mix(in srgb,var(--tblr-muted) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-muted-lt{color:color-mix(in srgb,var(--tblr-muted) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-muted-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-muted{border-color:color-mix(in srgb,var(--tblr-muted) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-muted{--tblr-gradient-from: var(--tblr-muted)}.bg-gradient-to-muted{--tblr-gradient-to: var(--tblr-muted)}.bg-gradient-via-muted{--tblr-gradient-via: var(--tblr-muted);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-muted{color:#f9fafb!important;background-color:RGBA(var(--tblr-muted-rgb),var(--tblr-bg-opacity, 1))!important}.link-muted{color:color-mix(in srgb,var(--tblr-muted) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-muted) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-muted:hover,.link-muted:focus{color:RGBA(86,91,102,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(86,91,102,var(--tblr-link-underline-opacity, 1))!important}.bg-blue{background-color:color-mix(in srgb,var(--tblr-blue) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-blue-lt{color:color-mix(in srgb,var(--tblr-blue) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-blue-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-blue{border-color:color-mix(in srgb,var(--tblr-blue) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-blue{--tblr-gradient-from: var(--tblr-blue)}.bg-gradient-to-blue{--tblr-gradient-to: var(--tblr-blue)}.bg-gradient-via-blue{--tblr-gradient-via: var(--tblr-blue);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-blue{color:#f9fafb!important;background-color:RGBA(var(--tblr-blue-rgb),var(--tblr-bg-opacity, 1))!important}.link-blue{color:color-mix(in srgb,var(--tblr-blue) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-blue) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-blue:hover,.link-blue:focus{color:RGBA(5,89,167,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(5,89,167,var(--tblr-link-underline-opacity, 1))!important}.bg-azure{background-color:color-mix(in srgb,var(--tblr-azure) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-azure-lt{color:color-mix(in srgb,var(--tblr-azure) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-azure-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-azure{border-color:color-mix(in srgb,var(--tblr-azure) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-azure{--tblr-gradient-from: var(--tblr-azure)}.bg-gradient-to-azure{--tblr-gradient-to: var(--tblr-azure)}.bg-gradient-via-azure{--tblr-gradient-via: var(--tblr-azure);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-azure{color:#f9fafb!important;background-color:RGBA(var(--tblr-azure-rgb),var(--tblr-bg-opacity, 1))!important}.link-azure{color:color-mix(in srgb,var(--tblr-azure) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-azure) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-azure:hover,.link-azure:focus{color:RGBA(53,122,180,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(53,122,180,var(--tblr-link-underline-opacity, 1))!important}.bg-indigo{background-color:color-mix(in srgb,var(--tblr-indigo) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-indigo-lt{color:color-mix(in srgb,var(--tblr-indigo) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-indigo-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-indigo{border-color:color-mix(in srgb,var(--tblr-indigo) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-indigo{--tblr-gradient-from: var(--tblr-indigo)}.bg-gradient-to-indigo{--tblr-gradient-to: var(--tblr-indigo)}.bg-gradient-via-indigo{--tblr-gradient-via: var(--tblr-indigo);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-indigo{color:#f9fafb!important;background-color:RGBA(var(--tblr-indigo-rgb),var(--tblr-bg-opacity, 1))!important}.link-indigo{color:color-mix(in srgb,var(--tblr-indigo) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-indigo) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-indigo:hover,.link-indigo:focus{color:RGBA(53,79,188,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(53,79,188,var(--tblr-link-underline-opacity, 1))!important}.bg-purple{background-color:color-mix(in srgb,var(--tblr-purple) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-purple-lt{color:color-mix(in srgb,var(--tblr-purple) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-purple-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-purple{border-color:color-mix(in srgb,var(--tblr-purple) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-purple{--tblr-gradient-from: var(--tblr-purple)}.bg-gradient-to-purple{--tblr-gradient-to: var(--tblr-purple)}.bg-gradient-via-purple{--tblr-gradient-via: var(--tblr-purple);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-purple{color:#f9fafb!important;background-color:RGBA(var(--tblr-purple-rgb),var(--tblr-bg-opacity, 1))!important}.link-purple{color:color-mix(in srgb,var(--tblr-purple) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-purple) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-purple:hover,.link-purple:focus{color:RGBA(139,50,161,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(139,50,161,var(--tblr-link-underline-opacity, 1))!important}.bg-pink{background-color:color-mix(in srgb,var(--tblr-pink) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-pink-lt{color:color-mix(in srgb,var(--tblr-pink) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-pink-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-pink{border-color:color-mix(in srgb,var(--tblr-pink) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-pink{--tblr-gradient-from: var(--tblr-pink)}.bg-gradient-to-pink{--tblr-gradient-to: var(--tblr-pink)}.bg-gradient-via-pink{--tblr-gradient-via: var(--tblr-pink);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-pink{color:#f9fafb!important;background-color:RGBA(var(--tblr-pink-rgb),var(--tblr-bg-opacity, 1))!important}.link-pink{color:color-mix(in srgb,var(--tblr-pink) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-pink) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-pink:hover,.link-pink:focus{color:RGBA(171,41,86,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(171,41,86,var(--tblr-link-underline-opacity, 1))!important}.bg-red{background-color:color-mix(in srgb,var(--tblr-red) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-red-lt{color:color-mix(in srgb,var(--tblr-red) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-red-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-red{border-color:color-mix(in srgb,var(--tblr-red) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-red{--tblr-gradient-from: var(--tblr-red)}.bg-gradient-to-red{--tblr-gradient-to: var(--tblr-red)}.bg-gradient-via-red{--tblr-gradient-via: var(--tblr-red);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-red{color:#f9fafb!important;background-color:RGBA(var(--tblr-red-rgb),var(--tblr-bg-opacity, 1))!important}.link-red{color:color-mix(in srgb,var(--tblr-red) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-red) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-red:hover,.link-red:focus{color:RGBA(171,46,46,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(171,46,46,var(--tblr-link-underline-opacity, 1))!important}.bg-orange{background-color:color-mix(in srgb,var(--tblr-orange) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-orange-lt{color:color-mix(in srgb,var(--tblr-orange) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-orange-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-orange{border-color:color-mix(in srgb,var(--tblr-orange) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-orange{--tblr-gradient-from: var(--tblr-orange)}.bg-gradient-to-orange{--tblr-gradient-to: var(--tblr-orange)}.bg-gradient-via-orange{--tblr-gradient-via: var(--tblr-orange);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-orange{color:#f9fafb!important;background-color:RGBA(var(--tblr-orange-rgb),var(--tblr-bg-opacity, 1))!important}.link-orange{color:color-mix(in srgb,var(--tblr-orange) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-orange) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-orange:hover,.link-orange:focus{color:RGBA(198,82,6,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(198,82,6,var(--tblr-link-underline-opacity, 1))!important}.bg-yellow{background-color:color-mix(in srgb,var(--tblr-yellow) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-yellow-lt{color:color-mix(in srgb,var(--tblr-yellow) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-yellow-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-yellow{border-color:color-mix(in srgb,var(--tblr-yellow) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-yellow{--tblr-gradient-from: var(--tblr-yellow)}.bg-gradient-to-yellow{--tblr-gradient-to: var(--tblr-yellow)}.bg-gradient-via-yellow{--tblr-gradient-via: var(--tblr-yellow);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-yellow{color:#f9fafb!important;background-color:RGBA(var(--tblr-yellow-rgb),var(--tblr-bg-opacity, 1))!important}.link-yellow{color:color-mix(in srgb,var(--tblr-yellow) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-yellow) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-yellow:hover,.link-yellow:focus{color:RGBA(196,127,0,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(196,127,0,var(--tblr-link-underline-opacity, 1))!important}.bg-lime{background-color:color-mix(in srgb,var(--tblr-lime) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-lime-lt{color:color-mix(in srgb,var(--tblr-lime) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-lime-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-lime{border-color:color-mix(in srgb,var(--tblr-lime) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-lime{--tblr-gradient-from: var(--tblr-lime)}.bg-gradient-to-lime{--tblr-gradient-to: var(--tblr-lime)}.bg-gradient-via-lime{--tblr-gradient-via: var(--tblr-lime);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-lime{color:#f9fafb!important;background-color:RGBA(var(--tblr-lime-rgb),var(--tblr-bg-opacity, 1))!important}.link-lime{color:color-mix(in srgb,var(--tblr-lime) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-lime) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-lime:hover,.link-lime:focus{color:RGBA(93,147,18,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(93,147,18,var(--tblr-link-underline-opacity, 1))!important}.bg-green{background-color:color-mix(in srgb,var(--tblr-green) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-green-lt{color:color-mix(in srgb,var(--tblr-green) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-green-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-green{border-color:color-mix(in srgb,var(--tblr-green) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-green{--tblr-gradient-from: var(--tblr-green)}.bg-gradient-to-green{--tblr-gradient-to: var(--tblr-green)}.bg-gradient-via-green{--tblr-gradient-via: var(--tblr-green);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-green{color:#f9fafb!important;background-color:RGBA(var(--tblr-green-rgb),var(--tblr-bg-opacity, 1))!important}.link-green{color:color-mix(in srgb,var(--tblr-green) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-green) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-green:hover,.link-green:focus{color:RGBA(38,143,54,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(38,143,54,var(--tblr-link-underline-opacity, 1))!important}.bg-teal{background-color:color-mix(in srgb,var(--tblr-teal) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-teal-lt{color:color-mix(in srgb,var(--tblr-teal) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-teal-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-teal{border-color:color-mix(in srgb,var(--tblr-teal) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-teal{--tblr-gradient-from: var(--tblr-teal)}.bg-gradient-to-teal{--tblr-gradient-to: var(--tblr-teal)}.bg-gradient-via-teal{--tblr-gradient-via: var(--tblr-teal);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-teal{color:#f9fafb!important;background-color:RGBA(var(--tblr-teal-rgb),var(--tblr-bg-opacity, 1))!important}.link-teal{color:color-mix(in srgb,var(--tblr-teal) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-teal) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-teal:hover,.link-teal:focus{color:RGBA(10,133,96,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(10,133,96,var(--tblr-link-underline-opacity, 1))!important}.bg-cyan{background-color:color-mix(in srgb,var(--tblr-cyan) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-cyan-lt{color:color-mix(in srgb,var(--tblr-cyan) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-cyan-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-cyan{border-color:color-mix(in srgb,var(--tblr-cyan) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-cyan{--tblr-gradient-from: var(--tblr-cyan)}.bg-gradient-to-cyan{--tblr-gradient-to: var(--tblr-cyan)}.bg-gradient-via-cyan{--tblr-gradient-via: var(--tblr-cyan);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-cyan{color:#f9fafb!important;background-color:RGBA(var(--tblr-cyan-rgb),var(--tblr-bg-opacity, 1))!important}.link-cyan{color:color-mix(in srgb,var(--tblr-cyan) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-cyan) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-cyan:hover,.link-cyan:focus{color:RGBA(18,130,147,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(18,130,147,var(--tblr-link-underline-opacity, 1))!important}.bg-white{background-color:color-mix(in srgb,var(--tblr-white) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.bg-white-lt{color:color-mix(in srgb,var(--tblr-white) calc(var(--tblr-text-opacity, 1) * 100%),transparent)!important;background-color:color-mix(in srgb,var(--tblr-white-lt) calc(var(--tblr-bg-opacity, 1) * 100%),transparent)!important}.border-white{border-color:color-mix(in srgb,var(--tblr-white) calc(var(--tblr-border-opacity, 1) * 100%),transparent)!important}.bg-gradient-from-white{--tblr-gradient-from: var(--tblr-white)}.bg-gradient-to-white{--tblr-gradient-to: var(--tblr-white)}.bg-gradient-via-white{--tblr-gradient-via: var(--tblr-white);--tblr-gradient-stops: var(--tblr-gradient-from, transparent), var(--tblr-gradient-via, transparent), var(--tblr-gradient-to, transparent)}.text-bg-white{color:#1f2937!important;background-color:RGBA(var(--tblr-white-rgb),var(--tblr-bg-opacity, 1))!important}.link-white{color:color-mix(in srgb,var(--tblr-white) calc(var(--tblr-link-opacity, 1) * 100%),transparent)!important;text-decoration-color:color-mix(in srgb,var(--tblr-white) calc(var(--tblr-link-underline-opacity, 1) * 100%),transparent)!important}.link-white:hover,.link-white:focus{color:RGBA(255,255,255,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(255,255,255,var(--tblr-link-underline-opacity, 1))!important}.text-primary{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-primary) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-primary-fg{color:var(--tblr-primary-fg)!important}.text-secondary{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-secondary) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-secondary-fg{color:var(--tblr-secondary-fg)!important}.text-success{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-success) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-success-fg{color:var(--tblr-success-fg)!important}.text-info{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-info) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-info-fg{color:var(--tblr-info-fg)!important}.text-warning{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-warning) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-warning-fg{color:var(--tblr-warning-fg)!important}.text-danger{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-danger) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-danger-fg{color:var(--tblr-danger-fg)!important}.text-light{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-light) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-light-fg{color:var(--tblr-light-fg)!important}.text-dark{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-dark) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-dark-fg{color:var(--tblr-dark-fg)!important}.text-muted{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-muted) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-muted-fg{color:var(--tblr-muted-fg)!important}.text-blue{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-blue) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-blue-fg{color:var(--tblr-blue-fg)!important}.text-azure{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-azure) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-azure-fg{color:var(--tblr-azure-fg)!important}.text-indigo{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-indigo) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-indigo-fg{color:var(--tblr-indigo-fg)!important}.text-purple{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-purple) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-purple-fg{color:var(--tblr-purple-fg)!important}.text-pink{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-pink) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-pink-fg{color:var(--tblr-pink-fg)!important}.text-red{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-red) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-red-fg{color:var(--tblr-red-fg)!important}.text-orange{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-orange) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-orange-fg{color:var(--tblr-orange-fg)!important}.text-yellow{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-yellow) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-yellow-fg{color:var(--tblr-yellow-fg)!important}.text-lime{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-lime) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-lime-fg{color:var(--tblr-lime-fg)!important}.text-green{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-green) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-green-fg{color:var(--tblr-green-fg)!important}.text-teal{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-teal) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-teal-fg{color:var(--tblr-teal-fg)!important}.text-cyan{--tblr-text-opacity: 1;color:color-mix(in srgb,var(--tblr-cyan) calc(var(--tblr-text-opacity) * 100%),transparent)!important}.text-cyan-fg{color:var(--tblr-cyan-fg)!important}.bg-gray-50{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-gray-50) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-gray-50-fg{color:var(--tblr-gray-50-fg)!important}.bg-gray-100{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-gray-100) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-gray-100-fg{color:var(--tblr-gray-100-fg)!important}.bg-gray-200{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-gray-200) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-gray-200-fg{color:var(--tblr-gray-200-fg)!important}.bg-gray-300{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-gray-300) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-gray-300-fg{color:var(--tblr-gray-300-fg)!important}.bg-gray-400{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-gray-400) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-gray-400-fg{color:var(--tblr-gray-400-fg)!important}.bg-gray-500{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-gray-500) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-gray-500-fg{color:var(--tblr-gray-500-fg)!important}.bg-gray-600{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-gray-600) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-gray-600-fg{color:var(--tblr-gray-600-fg)!important}.bg-gray-700{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-gray-700) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-gray-700-fg{color:var(--tblr-gray-700-fg)!important}.bg-gray-800{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-gray-800) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-gray-800-fg{color:var(--tblr-gray-800-fg)!important}.bg-gray-900{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-gray-900) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-gray-900-fg{color:var(--tblr-gray-900-fg)!important}.bg-gray-950{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-gray-950) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-gray-950-fg{color:var(--tblr-gray-950-fg)!important}.bg-x{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-x) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-x-fg{color:var(--tblr-x-fg)!important}.bg-facebook{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-facebook) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-facebook-fg{color:var(--tblr-facebook-fg)!important}.bg-twitter{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-twitter) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-twitter-fg{color:var(--tblr-twitter-fg)!important}.bg-linkedin{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-linkedin) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-linkedin-fg{color:var(--tblr-linkedin-fg)!important}.bg-google{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-google) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-google-fg{color:var(--tblr-google-fg)!important}.bg-youtube{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-youtube) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-youtube-fg{color:var(--tblr-youtube-fg)!important}.bg-vimeo{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-vimeo) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-vimeo-fg{color:var(--tblr-vimeo-fg)!important}.bg-dribbble{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-dribbble) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-dribbble-fg{color:var(--tblr-dribbble-fg)!important}.bg-github{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-github) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-github-fg{color:var(--tblr-github-fg)!important}.bg-instagram{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-instagram) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-instagram-fg{color:var(--tblr-instagram-fg)!important}.bg-pinterest{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-pinterest) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-pinterest-fg{color:var(--tblr-pinterest-fg)!important}.bg-vk{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-vk) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-vk-fg{color:var(--tblr-vk-fg)!important}.bg-rss{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-rss) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-rss-fg{color:var(--tblr-rss-fg)!important}.bg-flickr{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-flickr) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-flickr-fg{color:var(--tblr-flickr-fg)!important}.bg-bitbucket{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-bitbucket) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-bitbucket-fg{color:var(--tblr-bitbucket-fg)!important}.bg-tabler{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-tabler) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.text-tabler-fg{color:var(--tblr-tabler-fg)!important}.bg-inverted{--tblr-bg-opacity: 1;background-color:color-mix(in srgb,var(--tblr-bg-surface-inverted) calc(var(--tblr-bg-opacity) * 100%),transparent)!important}.bg-surface{background-color:var(--tblr-bg-surface)!important}.bg-surface-secondary{background-color:var(--tblr-bg-surface-secondary)!important}.bg-surface-tertiary{background-color:var(--tblr-bg-surface-tertiary)!important}.bg-surface-backdrop{background-color:color-mix(in srgb,var(--tblr-gray-800) 24%,transparent)!important}.scrollable{overflow-x:hidden;overflow-y:auto;-webkit-overflow-scrolling:touch}.scrollable.hover{overflow-y:hidden}.scrollable.hover>*{margin-top:-1px}.scrollable.hover:hover,.scrollable.hover:focus,.scrollable.hover:active{overflow:visible;overflow-y:auto}.touch .scrollable{overflow-y:auto!important}.scroll-x,.scroll-y{overflow:hidden;-webkit-overflow-scrolling:touch}.scroll-y{overflow-y:auto}.scroll-x{overflow-x:auto}.no-scroll{overflow:hidden}.w-0{width:0!important}.h-0{height:0!important}.w-1{width:.25rem!important}.h-1{height:.25rem!important}.w-2{width:.5rem!important}.h-2{height:.5rem!important}.w-3{width:1rem!important}.h-3{height:1rem!important}.w-4{width:1.5rem!important}.h-4{height:1.5rem!important}.w-5{width:2rem!important}.h-5{height:2rem!important}.w-6{width:2.5rem!important}.h-6{height:2.5rem!important}.w-auto{width:auto!important}.h-auto{height:auto!important}.w-px{width:1px!important}.h-px{height:1px!important}.w-full{width:100%!important}.h-full{height:100%!important}.opacity-0{opacity:0!important}.opacity-5{opacity:.05!important}.opacity-10{opacity:.1!important}.opacity-15{opacity:.15!important}.opacity-20{opacity:.2!important}.opacity-25{opacity:.25!important}.opacity-30{opacity:.3!important}.opacity-35{opacity:calc(35 / 100)!important}.opacity-40{opacity:.4!important}.opacity-45{opacity:.45!important}.opacity-50{opacity:.5!important}.opacity-55{opacity:.55!important}.opacity-60{opacity:.6!important}.opacity-65{opacity:.65!important}.opacity-70{opacity:calc(70 / 100)!important}.opacity-75{opacity:.75!important}.opacity-80{opacity:.8!important}.opacity-85{opacity:.85!important}.opacity-90{opacity:.9!important}.opacity-95{opacity:calc(95 / 100)!important}.opacity-100{opacity:1!important}.hover-shadow-sm:hover{box-shadow:0 .125rem .25rem #00000013!important}.hover-shadow:hover{box-shadow:rgba(var(--tblr-body-color-rgb),.04) 0 2px 4px!important}.hover-shadow-lg:hover{box-shadow:0 1rem 3rem #0000002d!important}.hover-shadow-none:hover{box-shadow:none!important}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.hover-rotate-start,.hover-rotate-end,.hover-scale,.hover-elevate-down,.hover-elevate-up{transition:transform .3s ease}.hover-rotate-start:hover,.hover-rotate-end:hover,.hover-scale:hover,.hover-elevate-down:hover,.hover-elevate-up:hover{will-change:transform}.hover-elevate-up:hover{transform:translateY(-4px)}.hover-elevate-down:hover{transform:translateY(4px)}.hover-scale:hover{transform:scale(1.1)}.hover-rotate-end:hover{transform:rotate(4deg)}.hover-rotate-start:hover{transform:rotate(-4deg)}.ts-control{border:1px solid var(--tblr-border-color);padding:.5625rem 1rem;width:100%;overflow:hidden;position:relative;z-index:1;box-sizing:border-box;box-shadow:none;border-radius:var(--tblr-border-radius);display:flex;flex-wrap:wrap}.ts-wrapper.multi.has-items .ts-control{padding:calc(.5625rem - 1px + -0) 1rem calc(.5625rem - 4px + -0)}.full .ts-control{background-color:var(--tblr-bg-forms)}.disabled .ts-control,.disabled .ts-control *{cursor:default!important}.focus .ts-control{box-shadow:none}.ts-control>*{vertical-align:baseline;display:inline-block}.ts-wrapper.multi .ts-control>div{cursor:pointer;margin:0 3px 3px 0;padding:1px 5px;background:#efefef;color:#1f2937;border:0 solid #e5e7eb;overflow:auto}.ts-wrapper.multi .ts-control>div.active{background:#00857d;color:#fff;border:0 solid rgba(0,0,0,0)}.ts-wrapper.multi.disabled .ts-control>div,.ts-wrapper.multi.disabled .ts-control>div.active{color:#787878;background:#fff;border:0 solid white}.ts-control>input{flex:1 1 auto;min-width:7rem;display:inline-block!important;padding:0!important;min-height:0!important;max-height:none!important;max-width:100%!important;margin:0!important;text-indent:0!important;border:0 none!important;background:none!important;line-height:inherit!important;user-select:auto!important;box-shadow:none!important}.ts-control>input::-ms-clear{display:none}.ts-control>input:focus{outline:none!important}.has-items .ts-control>input{margin:0 4px!important}.ts-control.rtl{text-align:right}.ts-control.rtl.single .ts-control:after{left:calc(1rem + 5px);right:auto}.ts-control.rtl .ts-control>input{margin:0 4px 0 -2px!important}.disabled .ts-control{opacity:1;background-color:var(--tblr-bg-surface-secondary)}.input-hidden .ts-control>input{opacity:0;position:absolute;left:-10000px}.ts-dropdown{position:absolute;top:100%;left:0;width:100%;z-index:10;border:1px solid #d0d0d0;background:var(--tblr-bg-surface);margin:.25rem 0 0;border-top:0 none;box-sizing:border-box;box-shadow:0 1px 3px #0000001a;border-radius:0 0 var(--tblr-border-radius) var(--tblr-border-radius)}.ts-dropdown [data-selectable]{cursor:pointer;overflow:hidden}.ts-dropdown [data-selectable] .highlight{background:#ffed2866;border-radius:1px}.ts-dropdown .option,.ts-dropdown .optgroup-header,.ts-dropdown .no-results,.ts-dropdown .create{padding:3px 1rem}.ts-dropdown .option,.ts-dropdown [data-disabled],.ts-dropdown [data-disabled] [data-selectable].option{cursor:inherit;opacity:.5}.ts-dropdown [data-selectable].option{opacity:1;cursor:pointer}.ts-dropdown .optgroup:first-child .optgroup-header{border-top:0 none}.ts-dropdown .optgroup-header{color:#4b5563;background:var(--tblr-bg-surface);cursor:default}.ts-dropdown .active{background-color:rgba(var(--tblr-secondary-rgb),.08);color:inherit}.ts-dropdown .active.create{color:inherit}.ts-dropdown .create{color:#1f293780}.ts-dropdown .spinner{display:inline-block;width:30px;height:30px;margin:3px 1rem}.ts-dropdown .spinner:after{content:" ";display:block;width:24px;height:24px;margin:3px;border-radius:50%;border:5px solid #d0d0d0;border-color:#d0d0d0 transparent #d0d0d0 transparent;animation:lds-dual-ring 1.2s linear infinite}@keyframes lds-dual-ring{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.ts-dropdown-content{overflow:hidden auto;max-height:200px;scroll-behavior:smooth}.ts-wrapper.plugin-drag_drop .ts-dragging{color:transparent!important}.ts-wrapper.plugin-drag_drop .ts-dragging>*{visibility:hidden!important}.plugin-checkbox_options:not(.rtl) .option input{margin-right:.5rem}.plugin-checkbox_options.rtl .option input{margin-left:.5rem}.plugin-clear_button{--ts-pr-clear-button: 1em}.plugin-clear_button .clear-button{opacity:0;position:absolute;top:50%;transform:translateY(-50%);right:calc(1rem - 5px);margin-right:0!important;background:transparent!important;transition:opacity .5s;cursor:pointer}.plugin-clear_button.form-select .clear-button,.plugin-clear_button.single .clear-button{right:max(var(--ts-pr-caret),1rem)}.plugin-clear_button.focus.has-items .clear-button,.plugin-clear_button:not(.disabled):hover.has-items .clear-button{opacity:1}.ts-wrapper .dropdown-header{position:relative;padding:6px 1rem;border-bottom:1px solid #d0d0d0;background:color-mix(var(--tblr-bg-surface),#d0d0d0,85%);border-radius:var(--tblr-border-radius) var(--tblr-border-radius) 0 0}.ts-wrapper .dropdown-header-close{position:absolute;right:1rem;top:50%;color:#1f2937;opacity:.4;margin-top:-12px;line-height:20px;font-size:20px!important}.ts-wrapper .dropdown-header-close:hover{color:#000}.plugin-dropdown_input.focus.dropdown-active .ts-control{box-shadow:none;border:1px solid var(--tblr-border-color);box-shadow:var(--tblr-shadow-input)}.plugin-dropdown_input .dropdown-input{border:1px solid #d0d0d0;border-width:0 0 1px;display:block;padding:.5625rem 1rem;box-shadow:none;width:100%;background:transparent}.plugin-dropdown_input.focus .ts-dropdown .dropdown-input{border-color:#80c2be;outline:0;box-shadow:var(--tblr-shadow-input),0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.plugin-dropdown_input .items-placeholder{border:0 none!important;box-shadow:none!important;width:100%}.plugin-dropdown_input.has-items .items-placeholder,.plugin-dropdown_input.dropdown-active .items-placeholder{display:none!important}.ts-wrapper.plugin-input_autogrow.has-items .ts-control>input{min-width:0}.ts-wrapper.plugin-input_autogrow.has-items.focus .ts-control>input{flex:none;min-width:4px}.ts-wrapper.plugin-input_autogrow.has-items.focus .ts-control>input::placeholder{color:transparent}.ts-dropdown.plugin-optgroup_columns .ts-dropdown-content{display:flex}.ts-dropdown.plugin-optgroup_columns .optgroup{border-right:1px solid #f2f2f2;border-top:0 none;flex-grow:1;flex-basis:0;min-width:0}.ts-dropdown.plugin-optgroup_columns .optgroup:last-child{border-right:0 none}.ts-dropdown.plugin-optgroup_columns .optgroup:before{display:none}.ts-dropdown.plugin-optgroup_columns .optgroup-header{border-top:0 none}.ts-wrapper.plugin-remove_button .item{display:inline-flex;align-items:center}.ts-wrapper.plugin-remove_button .item .remove{color:inherit;text-decoration:none;vertical-align:middle;display:inline-block;padding:0 5px;border-radius:0 2px 2px 0;box-sizing:border-box}.ts-wrapper.plugin-remove_button .item .remove:hover{background:#0000000d}.ts-wrapper.plugin-remove_button.disabled .item .remove:hover{background:none}.ts-wrapper.plugin-remove_button .remove-single{position:absolute;right:0;top:0;font-size:23px}.ts-wrapper.plugin-remove_button:not(.rtl) .item{padding-right:0!important}.ts-wrapper.plugin-remove_button:not(.rtl) .item .remove{border-left:1px solid #e5e7eb;margin-left:5px}.ts-wrapper.plugin-remove_button:not(.rtl) .item.active .remove{border-left-color:#0000}.ts-wrapper.plugin-remove_button:not(.rtl).disabled .item .remove{border-left-color:#fff}.ts-wrapper.plugin-remove_button.rtl .item{padding-left:0!important}.ts-wrapper.plugin-remove_button.rtl .item .remove{border-right:1px solid #e5e7eb;margin-right:5px}.ts-wrapper.plugin-remove_button.rtl .item.active .remove{border-right-color:#0000}.ts-wrapper.plugin-remove_button.rtl.disabled .item .remove{border-right-color:#fff}:root{--ts-pr-clear-button: 0px;--ts-pr-caret: 0px;--ts-pr-min: .75rem}.ts-wrapper.single .ts-control,.ts-wrapper.single .ts-control input{cursor:pointer}.ts-control:not(.rtl){padding-right:max(var(--ts-pr-min),var(--ts-pr-clear-button) + var(--ts-pr-caret))!important}.ts-control.rtl{padding-left:max(var(--ts-pr-min),var(--ts-pr-clear-button) + var(--ts-pr-caret))!important}.ts-wrapper{position:relative}.ts-dropdown,.ts-control,.ts-control input{color:#1f2937;font-family:inherit;font-size:inherit;line-height:1.25rem}.ts-control,.ts-wrapper.single.input-active .ts-control{background:var(--tblr-bg-forms);cursor:text}.ts-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;clip-path:inset(50%)!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important;white-space:nowrap!important}.ts-dropdown,.ts-dropdown.form-control,.ts-dropdown.form-select{height:auto;padding:0;z-index:1000;background:var(--tblr-bg-surface);border:1px solid var(--tblr-border-color-translucent);border-radius:6px;box-shadow:0 6px 12px #0000002d}.ts-dropdown .optgroup-header{font-size:.765625rem;line-height:1.4285714286}.ts-dropdown .optgroup:first-child:before{display:none}.ts-dropdown .optgroup:before{content:" ";display:block;height:0;margin:var(--tblr-spacer-2) 0;overflow:hidden;border-top:1px solid var(--tblr-border-color-translucent);margin-left:-1rem;margin-right:-1rem}.ts-dropdown .create{padding-left:1rem}.ts-dropdown-content{padding:5px 0}.ts-control{box-shadow:var(--tblr-shadow-input);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.ts-control{transition:none}}.ts-control{display:flex;align-items:center}.focus .ts-control{border-color:#80c2be;outline:0;box-shadow:var(--tblr-shadow-input),0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.ts-control .item{display:flex;align-items:center}.ts-control input::placeholder{color:var(--bs-secondary-color, #a7aeb8);opacity:1}.ts-wrapper.is-invalid,select.tomselected.is-invalid+div.ts-wrapper,.was-validated .invalid,.was-validated :invalid+.ts-wrapper{border-color:var(--tblr-form-invalid-color)}.ts-wrapper.is-invalid:not(.single),select.tomselected.is-invalid+div.ts-wrapper:not(.single),.was-validated .invalid:not(.single),.was-validated :invalid+.ts-wrapper:not(.single){background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23d63939' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cline x1='18' y1='6' x2='6' y2='18'%3e%3c/line%3e%3cline x1='6' y1='6' x2='18' y2='18'%3e%3c/line%3e%3c/svg%3e");background-position:right 1.53125rem center;background-size:1.8125rem 1.8125rem;background-repeat:no-repeat}.ts-wrapper.is-invalid.single,select.tomselected.is-invalid+div.ts-wrapper.single,.was-validated .invalid.single,.was-validated :invalid+.ts-wrapper.single{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%239ca3af' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23d63939' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cline x1='18' y1='6' x2='6' y2='18'%3e%3c/line%3e%3cline x1='6' y1='6' x2='18' y2='18'%3e%3c/line%3e%3c/svg%3e");background-position:right 1rem center,center right 3rem;background-size:16px 12px,1.8125rem 1.8125rem;background-repeat:no-repeat}.ts-wrapper.is-invalid.focus .ts-control,select.tomselected.is-invalid+div.ts-wrapper.focus .ts-control,.was-validated .invalid.focus .ts-control,.was-validated :invalid+.ts-wrapper.focus .ts-control{border-color:var(--tblr-form-invalid-color);box-shadow:0 0 0 .25rem rgba(var(--tblr-form-invalid-color),.25)}.ts-wrapper.is-valid,.was-validated .valid,.was-validated :valid+.ts-wrapper{border-color:var(--tblr-form-valid-color)}.ts-wrapper.is-valid:not(.single),.was-validated .valid:not(.single),.was-validated :valid+.ts-wrapper:not(.single){background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%232fb344' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='20 6 9 17 4 12'%3e%3c/polyline%3e%3c/svg%3e");background-position:right 1.53125rem center;background-size:1.8125rem 1.8125rem;background-repeat:no-repeat}.ts-wrapper.is-valid.single,.was-validated .valid.single,.was-validated :valid+.ts-wrapper.single{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%239ca3af' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%232fb344' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='20 6 9 17 4 12'%3e%3c/polyline%3e%3c/svg%3e");background-position:right 1rem center,center right 3rem;background-size:16px 12px,1.8125rem 1.8125rem;background-repeat:no-repeat}.ts-wrapper.is-valid.focus .ts-control,.was-validated .valid.focus .ts-control,.was-validated :valid+.ts-wrapper.focus .ts-control{border-color:var(--tblr-form-valid-color);box-shadow:0 0 0 .25rem rgba(var(--tblr-form-valid-color),.25)}.ts-wrapper{min-height:calc(1.25rem + 1.125rem + calc(var(--tblr-border-width) * 2));display:flex}.input-group-sm>.ts-wrapper,.ts-wrapper.form-select-sm,.ts-wrapper.form-control-sm{min-height:calc(1.25rem + .625rem + calc(var(--tblr-border-width) * 2))}.input-group-sm>.ts-wrapper .ts-control,.ts-wrapper.form-select-sm .ts-control,.ts-wrapper.form-control-sm .ts-control{border-radius:var(--tblr-border-radius-sm);font-size:.75rem}.input-group-sm>.ts-wrapper.has-items .ts-control,.ts-wrapper.form-select-sm.has-items .ts-control,.ts-wrapper.form-control-sm.has-items .ts-control{font-size:.75rem}.input-group-sm>.ts-wrapper.multi.has-items .ts-control,.ts-wrapper.form-select-sm.multi.has-items .ts-control,.ts-wrapper.form-control-sm.multi.has-items .ts-control{padding-top:calc((calc(1.25rem + .625rem + calc(var(--tblr-border-width) * 2)) - 1.25rem * .75rem - calc((var(--tblr-border-width) + 1px) * 2)) / 2)!important}.ts-wrapper.multi.has-items .ts-control{padding-left:calc(1rem - 5px);--ts-pr-min: calc(1rem - 5px) }.ts-wrapper.multi .ts-control>div{border-radius:calc(var(--tblr-border-radius) - 1px)}.input-group-lg>.ts-wrapper,.ts-wrapper.form-control-lg,.ts-wrapper.form-select-lg{min-height:calc(1.25rem + 1.375rem + calc(var(--tblr-border-width) * 2))}.input-group-lg>.ts-wrapper .ts-control,.ts-wrapper.form-control-lg .ts-control,.ts-wrapper.form-select-lg .ts-control{border-radius:var(--tblr-border-radius-lg);font-size:1rem}.ts-wrapper:not(.form-control,.form-select){padding:0;border:none;height:auto;box-shadow:none;background:none}.ts-wrapper:not(.form-control,.form-select).single .ts-control{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%239ca3af' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right 1rem center;background-size:16px 12px}.ts-wrapper.form-select,.ts-wrapper.single{--ts-pr-caret: 3rem}.ts-wrapper.form-control,.ts-wrapper.form-select{padding:0!important;height:auto;box-shadow:none;display:flex}.ts-wrapper.form-control .ts-control,.ts-wrapper.form-control.single.input-active .ts-control,.ts-wrapper.form-select .ts-control,.ts-wrapper.form-select.single.input-active .ts-control{border:none!important}.ts-wrapper.form-control:not(.disabled) .ts-control,.ts-wrapper.form-control:not(.disabled).single.input-active .ts-control,.ts-wrapper.form-select:not(.disabled) .ts-control,.ts-wrapper.form-select:not(.disabled).single.input-active .ts-control{background:transparent!important}.input-group>.ts-wrapper{flex-grow:1;width:1%}.input-group>.ts-wrapper:not(:nth-child(2))>.ts-control{border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.ts-wrapper:not(:last-child)>.ts-control{border-top-right-radius:0;border-bottom-right-radius:0}.form-select .ts-dropdown,.form-select .ts-control,.form-select .ts-control input{color:var(--tblr-body-color)}:root{--ts-pr-clear-button: 0rem;--ts-pr-caret: 0rem}.ts-input{color:inherit}.focus .ts-control{border-radius:var(--tblr-border-radius)}.ts-control{color:inherit}.ts-control .dropdown-menu{width:100%;height:auto}.ts-wrapper .form-control,.ts-wrapper .form-select,.ts-wrapper.form-control,.ts-wrapper.form-select{box-shadow:var(--tblr-shadow-input)}.ts-wrapper.is-invalid .ts-control,select.tomselected.is-invalid+div.ts-wrapper .ts-control,.ts-wrapper.is-valid .ts-control{--ts-pr-clear-button: 1.5rem}.ts-dropdown{background:var(--tblr-bg-surface);color:var(--tblr-body-color);box-shadow:var(--tblr-shadow-dropdown);z-index:1000}.ts-dropdown .option{padding:.5rem .75rem}.ts-control,.ts-control input{color:var(--tblr-body-color)}.ts-control input::placeholder{color:var(--tblr-tertiary)}.ts-wrapper.multi .ts-control>div,.ts-wrapper.multi.disabled .ts-control>div{background:var(--tblr-bg-surface-secondary);border:1px solid var(--tblr-border-color);color:var(--tblr-body-color)}.ts-wrapper.disabled .ts-control{opacity:1}.ts-wrapper.disabled .ts-control>div.item{color:var(--tblr-gray-500)}html{scroll-behavior:auto!important}mark,.mark{padding-left:0;padding-right:0}.table-responsive .dropdown,.table-responsive .btn-group,.table-responsive .btn-group-vertical{position:static}.progress{min-width:80px}hr.dropdown-divider,.dropdown-divider.hr{margin-bottom:.25rem;margin-top:.25rem}.dropdown-item{font-weight:400}*{font-feature-settings:"liga" 0;font-variant-ligatures:none}@media(min-width:992px){:root,:host{margin-left:0;scrollbar-gutter:stable}}pre{background-color:transparent;color:inherit}.alert{background:var(--tblr-bg-surface)}.badge{user-select:text}.btn{display:inline-block}.btn:focus{border:1px solid var(--tblr-primary-fg);outline:2px solid var(--tblr-primary)!important}.btn-sm,.btn-group-sm>.btn{border-radius:6px}.dropdown-item{display:inline-block}.footer .text-primary{color:#001423!important}.nav-tabs .nav-link{display:inline-block}.page,.page-tabs .nav-tabs .nav-link.active{background-color:var(--tblr-bg-surface-tertiary)!important}.navbar{--tblr-navbar-active-bg: rgba(0, 0, 0, .06)}[data-bs-theme=dark],body[data-bs-theme=dark] [data-bs-theme=light]{--tblr-alert-color: darken(var(--tblr-warning),10%);--tblr-link-color: #00F2D4;--tblr-link-color-rgb: 0,242,212;--tblr-link-hover-color-rgb: 0,242,212;--tblr-secondary: #9ca3af;--tblr-primary: #00F2D4;--tblr-primary-fg: #001423;--tblr-primary-rgb: 0,242,212;--tblr-btn-active-color: #001423}html[data-bs-theme=dark] ::selection,body[data-bs-theme=dark] html[data-bs-theme=light] ::selection{background-color:rgba(var(--tblr-primary-rgb),.48)}html[data-bs-theme=dark] .btn-primary,body[data-bs-theme=dark] html[data-bs-theme=light] .btn-primary,html[data-bs-theme=dark] .bg-primary .card-title,body[data-bs-theme=dark] html[data-bs-theme=light] .bg-primary .card-title,html[data-bs-theme=dark] .bg-primary a,body[data-bs-theme=dark] html[data-bs-theme=light] .bg-primary a,html[data-bs-theme=dark] .bg-primary i,body[data-bs-theme=dark] html[data-bs-theme=light] .bg-primary i,html[data-bs-theme=dark] .text-bg-primary,body[data-bs-theme=dark] html[data-bs-theme=light] .text-bg-primary{color:#001423!important}html[data-bs-theme=dark] .card,body[data-bs-theme=dark] html[data-bs-theme=light] .card{background:#001423!important}html[data-bs-theme=dark],body[data-bs-theme=dark] html[data-bs-theme=light],html[data-bs-theme=dark] .navbar,body[data-bs-theme=dark] html[data-bs-theme=light] .navbar,html[data-bs-theme=dark] .page-header,body[data-bs-theme=dark] html[data-bs-theme=light] .page-header{background-color:#001423}html[data-bs-theme=dark] .page,body[data-bs-theme=dark] html[data-bs-theme=light] .page,html[data-bs-theme=dark] .page-tabs .nav-tabs .nav-link.active,body[data-bs-theme=dark] html[data-bs-theme=light] .page-tabs .nav-tabs .nav-link.active{background-color:#081b2a!important}html[data-bs-theme=dark] .page-link.active,body[data-bs-theme=dark] html[data-bs-theme=light] .page-link.active,html[data-bs-theme=dark] .active>.page-link,body[data-bs-theme=dark] html[data-bs-theme=light] .active>.page-link{color:#001423}html[data-bs-theme=dark] .text-bg-primary,body[data-bs-theme=dark] html[data-bs-theme=light] .text-bg-primary{color:#001423!important}html[data-bs-theme=dark] .text-muted,body[data-bs-theme=dark] html[data-bs-theme=light] .text-muted{color:var(--tblr-secondary-color)!important}html[data-bs-theme=dark] .text-secondary,body[data-bs-theme=dark] html[data-bs-theme=light] .text-secondary{color:#9ca3af!important}html[data-bs-theme=dark] .footer .text-primary,body[data-bs-theme=dark] html[data-bs-theme=light] .footer .text-primary{color:#fff!important}html[data-bs-theme=dark] .toast,body[data-bs-theme=dark] html[data-bs-theme=light] .toast{color:var(--tblr-body-color)}html[data-bs-theme=dark] .table-primary,body[data-bs-theme=dark] html[data-bs-theme=light] .table-primary{--tblr-table-bg: rgba(var(--tblr-secondary-rgb), .48);--tblr-table-hover-bg: inherit;--tblr-table-hover-color: inherit}pre code{padding:unset}.dropdown-toggle:after{font-family:Material Design Icons;content:"\f0140";padding-right:9px;border-bottom:none;border-left:none;transform:none;vertical-align:.05em;height:auto}:root:not(.dummy)[data-bs-theme=light] .hide-theme-light,:root:not(.dummy)[data-bs-theme=dark] .hide-theme-dark,body[data-bs-theme=dark] [data-bs-theme=light]:root:not(.dummy) .hide-theme-dark{display:none!important}:root:not(.dummy)[data-bs-theme=dark] .hide-theme-light,body[data-bs-theme=dark] [data-bs-theme=light]:root:not(.dummy) .hide-theme-light,:root:not(.dummy)[data-bs-theme=light] .hide-theme-dark{display:inline-flex!important}.ts-wrapper.multi .ts-control{padding:7px 7px 3px}.ts-wrapper.multi .ts-control div{margin:0 4px 4px 0}.badge a{color:inherit;text-decoration:none}.page-body .card{margin-bottom:1rem}.page-body .card .card-header,.page-body .card .card-body,.page-body .card .card-footer{padding:.75rem}.page-body .card .card-header{background:var(--tblr-bg-surface-tertiary)}.page-body .card h2.card-header,.page-body .card .card-header.h2{font-size:var(--tblr-font-size-h5);line-height:var(--tblr-line-height-h5);margin-bottom:0}.page-body .card .list-group-item{padding:.5rem .75rem}.page-body .card .table,.page-body .card .markdown>table{margin-bottom:0}form.object-edit{margin:auto;max-width:800px}.col-form-label.required{font-weight:700}.col-form-label.required:after{position:absolute;display:inline-block;margin-left:0;font-family:Material Design Icons;font-size:8px;content:"\f06c4"}.has-errors input,.has-errors select,.has-errors textarea{border:1px solid #d63939}select[multiple] optgroup{top:0;background-color:var(--bs-body-bg);font-style:normal;font-weight:700}select[multiple] option{padding-left:.5rem}.modifier-select{min-width:10rem;max-width:15rem;width:auto;white-space:nowrap}.page{background-color:var(--tblr-bg-surface-secondary)}.page-header{background-color:var(--tblr-bg-surface);min-height:0}.navbar-vertical.navbar-expand-lg .navbar-collapse .nav-link-icon,.navbar-vertical.navbar-expand-lg .navbar-collapse .nav-link-title{color:#001423}.navbar-vertical.navbar-expand-lg .navbar-collapse .text-secondary{color:#00857d!important}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item a{color:#001423}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item .btn-group{visibility:hidden}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item:hover,.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item.active{background-color:var(--tblr-navbar-active-bg)}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item:hover a,.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item.active a{text-decoration:none}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item:hover .btn-group,.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item.active .btn-group{visibility:visible}.navbar-vertical.navbar-expand-lg .navbar-nav{z-index:1}@media(max-width:991.98px){.navbar-vertical.navbar-expand-lg .navbar-brand{padding:.2rem 0}}.navbar-vertical.navbar-expand-lg .navbar-brand a:hover{text-decoration:none}.navbar-vertical.navbar-expand-lg img.motif{bottom:0;display:none;left:0;mask-image:linear-gradient(180deg,#0000,#0000004d);opacity:.5;position:fixed;user-drag:none;user-select:none;-moz-user-select:none;-webkit-user-drag:none;-webkit-user-select:none;-ms-user-select:none;width:18rem}@media(min-width:992px){.navbar-vertical.navbar-expand-lg img.motif{display:block}}html[data-bs-theme=light] .navbar-vertical.navbar-expand-lg{background:linear-gradient(180deg,#00857d00,#00857d1a),#fff}html[data-bs-theme=dark] .navbar-vertical.navbar-expand-lg,body[data-bs-theme=dark] html[data-bs-theme=light] .navbar-vertical.navbar-expand-lg{background:linear-gradient(180deg,#00f2d400,#00f2d41a),#001423}html[data-bs-theme=dark] .navbar-vertical.navbar-expand-lg .nav-item.dropdown.active:after,body[data-bs-theme=dark] html[data-bs-theme=light] .navbar-vertical.navbar-expand-lg .nav-item.dropdown.active:after{border-color:#00f2d4!important}html[data-bs-theme=dark] .navbar-vertical.navbar-expand-lg .nav-link-title,body[data-bs-theme=dark] html[data-bs-theme=light] .navbar-vertical.navbar-expand-lg .nav-link-title,html[data-bs-theme=dark] .navbar-vertical.navbar-expand-lg .nav-link-icon,body[data-bs-theme=dark] html[data-bs-theme=light] .navbar-vertical.navbar-expand-lg .nav-link-icon,html[data-bs-theme=dark] .navbar-vertical.navbar-expand-lg .dropdown-item a,body[data-bs-theme=dark] html[data-bs-theme=light] .navbar-vertical.navbar-expand-lg .dropdown-item a{color:#fff!important}html[data-bs-theme=dark] .navbar-vertical.navbar-expand-lg .dropdown-item.active,body[data-bs-theme=dark] html[data-bs-theme=light] .navbar-vertical.navbar-expand-lg .dropdown-item.active,html[data-bs-theme=dark] .navbar-vertical.navbar-expand-lg .dropdown-item:hover,body[data-bs-theme=dark] html[data-bs-theme=light] .navbar-vertical.navbar-expand-lg .dropdown-item:hover{background-color:#ffffff0f!important}html[data-bs-theme=dark] .navbar-vertical.navbar-expand-lg .text-secondary,body[data-bs-theme=dark] html[data-bs-theme=light] .navbar-vertical.navbar-expand-lg .text-secondary{color:#00f2d4!important}html[data-bs-theme=dark] .navbar-vertical.navbar-expand-lg img.motif,body[data-bs-theme=dark] html[data-bs-theme=light] .navbar-vertical.navbar-expand-lg img.motif{opacity:.25}.progress{height:20px}.progress .progress-label{display:flex;flex-direction:column;justify-content:center;padding-left:.25rem}.table thead th,.markdown>table thead th{font-size:.625rem}table.object-list tbody>tr:last-child>td{border-bottom-width:0}table.object-list th.asc>a:after{content:"\f0140";font-family:Material Design Icons}table.object-list th.desc>a:after{content:"\f0143";font-family:Material Design Icons}table.attr-table th{font-weight:400;width:min-content}table.attr-table th,table.attr-table td{border-bottom-style:dashed}table.attr-table tr:last-child{border-bottom-style:hidden}table.attr-table td{overflow-wrap:anywhere}td pre{margin-bottom:0}table th.orderable a{color:var(--tblr-body-color)}html[data-bs-theme=dark] .table thead th,body[data-bs-theme=dark] html[data-bs-theme=light] .table thead th,body[data-bs-theme=dark] html[data-bs-theme=light] .markdown>table thead th,html[data-bs-theme=dark] .markdown>table thead th{background:#001423!important}.page-tabs{border-bottom:1px solid var(--tblr-border-color-translucent)}.page-tabs .nav-tabs{position:relative;border:none}.page-tabs .nav-tabs .nav-link.active,.page-tabs .nav-tabs .nav-link:active,.page-tabs .nav-tabs .nav-link:hover{border-color:var(--tblr-border-color-translucent);border-bottom-color:transparent}.page-tabs .nav-tabs .nav-link.active{color:inherit;background:var(--tblr-bg-surface-secondary);border-bottom-color:transparent}pre.change-data{border-radius:0;padding:0;margin-inline:-.75rem}pre.change-data>span{display:block;padding-inline:.5rem;max-width:100%;min-width:fit-content;border-left:.25rem solid transparent}pre.change-data>span.added{background-color:var(--tblr-green-200);border-left-color:var(--tblr-green-darken)}pre.change-data>span.removed{background-color:var(--tblr-red-200);border-left-color:var(--tblr-red-darken)}pre.change-diff{border:var(--tblr-border-width) solid transparent}pre.change-diff.change-added{background-color:var(--tblr-green-lt);border-color:var(--tblr-green)}pre.change-diff.change-removed{background-color:var(--tblr-red-lt);border-color:var(--tblr-red)}pre.block{padding:1rem;border:var(--tblr-border-width) solid #e5e7eb;border-radius:6px}.grid-stack .card-header.bg-default{background:var(--tblr-bg-surface-secondary)!important}.grid-stack .card-header a{color:inherit!important}tr[data-cable-status=connected]{background-color:#2fb34426}tr[data-cable-status=planned]{background-color:#066fd126}tr[data-cable-status=decommissioning]{background-color:#f59f0026}tr[data-mark-connected=true]{background-color:#2fb34426}tr[data-virtual=true]{background-color:#00857d26}tr[data-enabled=disabled]{background-color:#9ca3af26}tr[data-cable-status=connected] button.mark-installed{display:none}tr:not([data-cable-status=connected]) button.mark-planned{display:none}.rendered-markdown table{width:100%}.rendered-markdown table th{border-bottom:2px solid #dddddd;padding:8px}.rendered-markdown table td{border-top:1px solid #dddddd;padding:8px}.rendered-markdown table th[align=left]{text-align:left}.rendered-markdown table th[align=center]{text-align:center}.rendered-markdown table th[align=right]{text-align:right}.rendered-markdown p:last-child{margin-bottom:0}td>.rendered-markdown{max-height:200px;overflow-y:scroll}.markdown-widget .preview{border:1px solid #e5e7eb;border-radius:6px;min-height:200px}span.color-label{display:inline-block;width:5rem;height:1rem;padding:.25em .5em;border:1px solid #303030;border-radius:6px}.record-depth{display:inline;user-select:none;opacity:33%}.record-depth span:only-of-type,.record-depth span:last-of-type{margin-right:.25rem}.hide-last-child :last-child{visibility:hidden;opacity:0}.netbox-edition{letter-spacing:.15rem}.logo{height:80px}.sso-icon{height:24px}img.plugin-icon{max-width:1.4285em;height:auto}.thumbnail{max-width:200px}.thumbnail img{border:1px solid #606060}.image-preview-popover{--bs-popover-max-width: clamp(240px, 25vw, 640px)}.image-preview-popover .popover-header{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.image-preview-popover .popover-body{display:flex;justify-content:center;align-items:center}.image-preview-popover img{display:block;max-width:100%;max-height:clamp(160px,33vh,640px);height:auto}html[data-bs-theme=dark] img.plugin-icon,body[data-bs-theme=dark] html[data-bs-theme=light] img.plugin-icon{filter:grayscale(100%) invert(100%) brightness(80%)}.sticky-actions{z-index:4}.sticky-actions[data-sticky-when=always],.sticky-actions.is-sticky-active{position:sticky;bottom:.25rem}.sticky-actions[data-sticky-position=left],.sticky-actions[data-sticky-position=right]{display:flex;align-items:center;gap:.5rem;padding:.5rem;max-width:100%;width:fit-content}.sticky-actions[data-sticky-position=right]{margin-left:auto}.sticky-actions[data-sticky-position=full]{max-width:100%}.sticky-actions-footer{max-width:100%;margin-top:1.5rem;padding:1rem;padding-bottom:calc(1rem + env(safe-area-inset-bottom,0));background:var(--tblr-bg-surface-secondary);border-top:1px solid var(--tblr-border-color)}.sticky-actions-footer[data-sticky-when=always],.sticky-actions-footer.is-sticky-active{bottom:0}.sticky-actions-footer>.btn-list{justify-content:flex-end;margin-bottom:0}.object-edit--with-sticky-actions{padding-bottom:calc(1.5rem + env(safe-area-inset-bottom,0))}[data-sticky-when=selection] .bulk-action-buttons .btn:disabled,[data-sticky-when=selection] .bulk-action-buttons .btn.disabled{border-color:transparent;box-shadow:none}[data-sticky-when=selection] .bulk-action-buttons .btn.disabled{pointer-events:none}.btn-float-group-right{position:sticky;bottom:10px;z-index:4;margin-left:auto;width:fit-content}.btn-float-group-left{position:sticky;bottom:10px;z-index:4;width:fit-content}tr[data-read=True] td{background-color:var(--tblr-bg-surface-secondary);color:#6b7280}.rack-loading-container{min-height:200px;margin-left:30px} diff --git a/netbox/project-static/dist/netbox.js b/netbox/project-static/dist/netbox.js index 761b948d1..d7fe74cc4 100644 --- a/netbox/project-static/dist/netbox.js +++ b/netbox/project-static/dist/netbox.js @@ -1,11 +1,11 @@ -"use strict";(()=>{var su=Object.create;var Ni=Object.defineProperty,au=Object.defineProperties,lu=Object.getOwnPropertyDescriptor,cu=Object.getOwnPropertyDescriptors,uu=Object.getOwnPropertyNames,gs=Object.getOwnPropertySymbols,du=Object.getPrototypeOf,vs=Object.prototype.hasOwnProperty,fu=Object.prototype.propertyIsEnumerable;var Gr=(n,e,t)=>e in n?Ni(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t,O=(n,e)=>{for(var t in e||(e={}))vs.call(e,t)&&Gr(n,t,e[t]);if(gs)for(var t of gs(e))fu.call(e,t)&&Gr(n,t,e[t]);return n},ae=(n,e)=>au(n,cu(e));var hu=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports),ys=(n,e)=>{for(var t in e)Ni(n,t,{get:e[t],enumerable:!0})},pu=(n,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of uu(e))!vs.call(n,r)&&r!==t&&Ni(n,r,{get:()=>e[r],enumerable:!(i=lu(e,r))||i.enumerable});return n};var mu=(n,e,t)=>(t=n!=null?su(du(n)):{},pu(e||!n||!n.__esModule?Ni(t,"default",{value:n,enumerable:!0}):t,n));var te=(n,e,t)=>Gr(n,typeof e!="symbol"?e+"":e,t);var at=(n,e,t)=>new Promise((i,r)=>{var o=l=>{try{a(t.next(l))}catch(c){r(c)}},s=l=>{try{a(t.throw(l))}catch(c){r(c)}},a=l=>l.done?i(l.value):Promise.resolve(l.value).then(o,s);a((t=t.apply(n,e)).next())});var _c=hu((yi,is)=>{(function(e,t){typeof yi=="object"&&typeof is=="object"?is.exports=t():typeof define=="function"&&define.amd?define([],t):typeof yi=="object"?yi.ClipboardJS=t():e.ClipboardJS=t()})(yi,function(){return(function(){var n={686:(function(i,r,o){"use strict";o.d(r,{default:function(){return Ie}});var s=o(279),a=o.n(s),l=o(370),c=o.n(l),u=o(817),d=o.n(u);function p(W){try{return document.execCommand(W)}catch(M){return!1}}var y=function(M){var S=d()(M);return p("cut"),S},m=y;function v(W){var M=document.documentElement.getAttribute("dir")==="rtl",S=document.createElement("textarea");S.style.fontSize="12pt",S.style.border="0",S.style.padding="0",S.style.margin="0",S.style.position="absolute",S.style[M?"right":"left"]="-9999px";var $=window.pageYOffset||document.documentElement.scrollTop;return S.style.top="".concat($,"px"),S.setAttribute("readonly",""),S.value=W,S}var _=function(M,S){var $=v(M);S.container.appendChild($);var B=d()($);return p("copy"),$.remove(),B},C=function(M){var S=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},$="";return typeof M=="string"?$=_(M,S):M instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(M==null?void 0:M.type)?$=_(M.value,S):($=d()(M),p("copy")),$},D=C;function w(W){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?w=function(S){return typeof S}:w=function(S){return S&&typeof Symbol=="function"&&S.constructor===Symbol&&S!==Symbol.prototype?"symbol":typeof S},w(W)}var T=function(){var M=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},S=M.action,$=S===void 0?"copy":S,B=M.container,q=M.target,U=M.text;if($!=="copy"&&$!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(q!==void 0)if(q&&w(q)==="object"&&q.nodeType===1){if($==="copy"&&q.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if($==="cut"&&(q.hasAttribute("readonly")||q.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(U)return D(U,{container:B});if(q)return $==="cut"?m(q):D(q,{container:B})},K=T;function z(W){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?z=function(S){return typeof S}:z=function(S){return S&&typeof Symbol=="function"&&S.constructor===Symbol&&S!==Symbol.prototype?"symbol":typeof S},z(W)}function H(W,M){if(!(W instanceof M))throw new TypeError("Cannot call a class as a function")}function R(W,M){for(var S=0;S0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof B.action=="function"?B.action:this.defaultAction,this.target=typeof B.target=="function"?B.target:this.defaultTarget,this.text=typeof B.text=="function"?B.text:this.defaultText,this.container=z(B.container)==="object"?B.container:document.body}},{key:"listenClick",value:function(B){var q=this;this.listener=c()(B,"click",function(U){return q.onClick(U)})}},{key:"onClick",value:function(B){var q=B.delegateTarget||B.currentTarget,U=this.action(q)||"copy",ee=K({action:U,container:this.container,target:this.target(q),text:this.text(q)});this.emit(ee?"success":"error",{action:U,text:ee,trigger:q,clearSelection:function(){q&&q.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(B){return ie("action",B)}},{key:"defaultTarget",value:function(B){var q=ie("target",B);if(q)return document.querySelector(q)}},{key:"defaultText",value:function(B){return ie("text",B)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(B){var q=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return D(B,q)}},{key:"cut",value:function(B){return m(B)}},{key:"isSupported",value:function(){var B=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],q=typeof B=="string"?[B]:B,U=!!document.queryCommandSupported;return q.forEach(function(ee){U=U&&!!document.queryCommandSupported(ee)}),U}}]),S})(a()),Ie=Ue}),828:(function(i){var r=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var o=Element.prototype;o.matches=o.matchesSelector||o.mozMatchesSelector||o.msMatchesSelector||o.oMatchesSelector||o.webkitMatchesSelector}function s(a,l){for(;a&&a.nodeType!==r;){if(typeof a.matches=="function"&&a.matches(l))return a;a=a.parentNode}}i.exports=s}),438:(function(i,r,o){var s=o(828);function a(u,d,p,y,m){var v=c.apply(this,arguments);return u.addEventListener(p,v,m),{destroy:function(){u.removeEventListener(p,v,m)}}}function l(u,d,p,y,m){return typeof u.addEventListener=="function"?a.apply(null,arguments):typeof p=="function"?a.bind(null,document).apply(null,arguments):(typeof u=="string"&&(u=document.querySelectorAll(u)),Array.prototype.map.call(u,function(v){return a(v,d,p,y,m)}))}function c(u,d,p,y){return function(m){m.delegateTarget=s(m.target,d),m.delegateTarget&&y.call(u,m)}}i.exports=l}),879:(function(i,r){r.node=function(o){return o!==void 0&&o instanceof HTMLElement&&o.nodeType===1},r.nodeList=function(o){var s=Object.prototype.toString.call(o);return o!==void 0&&(s==="[object NodeList]"||s==="[object HTMLCollection]")&&"length"in o&&(o.length===0||r.node(o[0]))},r.string=function(o){return typeof o=="string"||o instanceof String},r.fn=function(o){var s=Object.prototype.toString.call(o);return s==="[object Function]"}}),370:(function(i,r,o){var s=o(879),a=o(438);function l(p,y,m){if(!p&&!y&&!m)throw new Error("Missing required arguments");if(!s.string(y))throw new TypeError("Second argument must be a String");if(!s.fn(m))throw new TypeError("Third argument must be a Function");if(s.node(p))return c(p,y,m);if(s.nodeList(p))return u(p,y,m);if(s.string(p))return d(p,y,m);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function c(p,y,m){return p.addEventListener(y,m),{destroy:function(){p.removeEventListener(y,m)}}}function u(p,y,m){return Array.prototype.forEach.call(p,function(v){v.addEventListener(y,m)}),{destroy:function(){Array.prototype.forEach.call(p,function(v){v.removeEventListener(y,m)})}}}function d(p,y,m){return a(document.body,p,y,m)}i.exports=l}),817:(function(i){function r(o){var s;if(o.nodeName==="SELECT")o.focus(),s=o.value;else if(o.nodeName==="INPUT"||o.nodeName==="TEXTAREA"){var a=o.hasAttribute("readonly");a||o.setAttribute("readonly",""),o.select(),o.setSelectionRange(0,o.value.length),a||o.removeAttribute("readonly"),s=o.value}else{o.hasAttribute("contenteditable")&&o.focus();var l=window.getSelection(),c=document.createRange();c.selectNodeContents(o),l.removeAllRanges(),l.addRange(c),s=l.toString()}return s}i.exports=r}),279:(function(i){function r(){}r.prototype={on:function(o,s,a){var l=this.e||(this.e={});return(l[o]||(l[o]=[])).push({fn:s,ctx:a}),this},once:function(o,s,a){var l=this;function c(){l.off(o,c),s.apply(a,arguments)}return c._=s,this.on(o,c,a)},emit:function(o){var s=[].slice.call(arguments,1),a=((this.e||(this.e={}))[o]||[]).slice(),l=0,c=a.length;for(l;lTs,afterRead:()=>_s,afterWrite:()=>Ss,applyStyles:()=>pn,arrow:()=>Hi,auto:()=>Wn,basePlacements:()=>lt,beforeMain:()=>ws,beforeRead:()=>Es,beforeWrite:()=>Cs,bottom:()=>ge,clippingParents:()=>Kr,computeStyles:()=>gn,createPopper:()=>Zn,createPopperBase:()=>Is,createPopperLite:()=>Ps,detectOverflow:()=>ke,end:()=>bt,eventListeners:()=>vn,flip:()=>Fi,hide:()=>$i,left:()=>pe,main:()=>xs,modifierPhases:()=>Qr,offset:()=>Bi,placements:()=>Un,popper:()=>$t,popperGenerator:()=>Yt,popperOffsets:()=>bn,preventOverflow:()=>Vi,read:()=>bs,reference:()=>Xr,right:()=>me,start:()=>rt,top:()=>de,variationPlacements:()=>ki,viewport:()=>qn,write:()=>As});var de="top",ge="bottom",me="right",pe="left",Wn="auto",lt=[de,ge,me,pe],rt="start",bt="end",Kr="clippingParents",qn="viewport",$t="popper",Xr="reference",ki=lt.reduce(function(n,e){return n.concat([e+"-"+rt,e+"-"+bt])},[]),Un=[].concat(lt,[Wn]).reduce(function(n,e){return n.concat([e,e+"-"+rt,e+"-"+bt])},[]),Es="beforeRead",bs="read",_s="afterRead",ws="beforeMain",xs="main",Ts="afterMain",Cs="beforeWrite",As="write",Ss="afterWrite",Qr=[Es,bs,_s,ws,xs,Ts,Cs,As,Ss];function xe(n){return n?(n.nodeName||"").toLowerCase():null}function ce(n){if(n==null)return window;if(n.toString()!=="[object Window]"){var e=n.ownerDocument;return e&&e.defaultView||window}return n}function Ye(n){var e=ce(n).Element;return n instanceof e||n instanceof Element}function _e(n){var e=ce(n).HTMLElement;return n instanceof e||n instanceof HTMLElement}function hn(n){if(typeof ShadowRoot=="undefined")return!1;var e=ce(n).ShadowRoot;return n instanceof e||n instanceof ShadowRoot}function gu(n){var e=n.state;Object.keys(e.elements).forEach(function(t){var i=e.styles[t]||{},r=e.attributes[t]||{},o=e.elements[t];!_e(o)||!xe(o)||(Object.assign(o.style,i),Object.keys(r).forEach(function(s){var a=r[s];a===!1?o.removeAttribute(s):o.setAttribute(s,a===!0?"":a)}))})}function vu(n){var e=n.state,t={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,t.popper),e.styles=t,e.elements.arrow&&Object.assign(e.elements.arrow.style,t.arrow),function(){Object.keys(e.elements).forEach(function(i){var r=e.elements[i],o=e.attributes[i]||{},s=Object.keys(e.styles.hasOwnProperty(i)?e.styles[i]:t[i]),a=s.reduce(function(l,c){return l[c]="",l},{});!_e(r)||!xe(r)||(Object.assign(r.style,a),Object.keys(o).forEach(function(l){r.removeAttribute(l)}))})}}var pn={name:"applyStyles",enabled:!0,phase:"write",fn:gu,effect:vu,requires:["computeStyles"]};function Te(n){return n.split("-")[0]}var Ze=Math.max,Bt=Math.min,ct=Math.round;function mn(){var n=navigator.userAgentData;return n!=null&&n.brands&&Array.isArray(n.brands)?n.brands.map(function(e){return e.brand+"/"+e.version}).join(" "):navigator.userAgent}function Yn(){return!/^((?!chrome|android).)*safari/i.test(mn())}function Ge(n,e,t){e===void 0&&(e=!1),t===void 0&&(t=!1);var i=n.getBoundingClientRect(),r=1,o=1;e&&_e(n)&&(r=n.offsetWidth>0&&ct(i.width)/n.offsetWidth||1,o=n.offsetHeight>0&&ct(i.height)/n.offsetHeight||1);var s=Ye(n)?ce(n):window,a=s.visualViewport,l=!Yn()&&t,c=(i.left+(l&&a?a.offsetLeft:0))/r,u=(i.top+(l&&a?a.offsetTop:0))/o,d=i.width/r,p=i.height/o;return{width:d,height:p,top:u,right:c+d,bottom:u+p,left:c,x:c,y:u}}function Vt(n){var e=Ge(n),t=n.offsetWidth,i=n.offsetHeight;return Math.abs(e.width-t)<=1&&(t=e.width),Math.abs(e.height-i)<=1&&(i=e.height),{x:n.offsetLeft,y:n.offsetTop,width:t,height:i}}function Gn(n,e){var t=e.getRootNode&&e.getRootNode();if(n.contains(e))return!0;if(t&&hn(t)){var i=e;do{if(i&&n.isSameNode(i))return!0;i=i.parentNode||i.host}while(i)}return!1}function Ne(n){return ce(n).getComputedStyle(n)}function Jr(n){return["table","td","th"].indexOf(xe(n))>=0}function Ae(n){return((Ye(n)?n.ownerDocument:n.document)||window.document).documentElement}function ut(n){return xe(n)==="html"?n:n.assignedSlot||n.parentNode||(hn(n)?n.host:null)||Ae(n)}function Ds(n){return!_e(n)||Ne(n).position==="fixed"?null:n.offsetParent}function yu(n){var e=/firefox/i.test(mn()),t=/Trident/i.test(mn());if(t&&_e(n)){var i=Ne(n);if(i.position==="fixed")return null}var r=ut(n);for(hn(r)&&(r=r.host);_e(r)&&["html","body"].indexOf(xe(r))<0;){var o=Ne(r);if(o.transform!=="none"||o.perspective!=="none"||o.contain==="paint"||["transform","perspective"].indexOf(o.willChange)!==-1||e&&o.willChange==="filter"||e&&o.filter&&o.filter!=="none")return r;r=r.parentNode}return null}function et(n){for(var e=ce(n),t=Ds(n);t&&Jr(t)&&Ne(t).position==="static";)t=Ds(t);return t&&(xe(t)==="html"||xe(t)==="body"&&Ne(t).position==="static")?e:t||yu(n)||e}function zt(n){return["top","bottom"].indexOf(n)>=0?"x":"y"}function jt(n,e,t){return Ze(n,Bt(e,t))}function Os(n,e,t){var i=jt(n,e,t);return i>t?t:i}function Kn(){return{top:0,right:0,bottom:0,left:0}}function Xn(n){return Object.assign({},Kn(),n)}function Qn(n,e){return e.reduce(function(t,i){return t[i]=n,t},{})}var Eu=function(e,t){return e=typeof e=="function"?e(Object.assign({},t.rects,{placement:t.placement})):e,Xn(typeof e!="number"?e:Qn(e,lt))};function bu(n){var e,t=n.state,i=n.name,r=n.options,o=t.elements.arrow,s=t.modifiersData.popperOffsets,a=Te(t.placement),l=zt(a),c=[pe,me].indexOf(a)>=0,u=c?"height":"width";if(!(!o||!s)){var d=Eu(r.padding,t),p=Vt(o),y=l==="y"?de:pe,m=l==="y"?ge:me,v=t.rects.reference[u]+t.rects.reference[l]-s[l]-t.rects.popper[u],_=s[l]-t.rects.reference[l],C=et(o),D=C?l==="y"?C.clientHeight||0:C.clientWidth||0:0,w=v/2-_/2,T=d[y],K=D-p[u]-d[m],z=D/2-p[u]/2+w,H=jt(T,z,K),R=l;t.modifiersData[i]=(e={},e[R]=H,e.centerOffset=H-z,e)}}function _u(n){var e=n.state,t=n.options,i=t.element,r=i===void 0?"[data-popper-arrow]":i;r!=null&&(typeof r=="string"&&(r=e.elements.popper.querySelector(r),!r)||Gn(e.elements.popper,r)&&(e.elements.arrow=r))}var Hi={name:"arrow",enabled:!0,phase:"main",fn:bu,effect:_u,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Ke(n){return n.split("-")[1]}var wu={top:"auto",right:"auto",bottom:"auto",left:"auto"};function xu(n,e){var t=n.x,i=n.y,r=e.devicePixelRatio||1;return{x:ct(t*r)/r||0,y:ct(i*r)/r||0}}function Ls(n){var e,t=n.popper,i=n.popperRect,r=n.placement,o=n.variation,s=n.offsets,a=n.position,l=n.gpuAcceleration,c=n.adaptive,u=n.roundOffsets,d=n.isFixed,p=s.x,y=p===void 0?0:p,m=s.y,v=m===void 0?0:m,_=typeof u=="function"?u({x:y,y:v}):{x:y,y:v};y=_.x,v=_.y;var C=s.hasOwnProperty("x"),D=s.hasOwnProperty("y"),w=pe,T=de,K=window;if(c){var z=et(t),H="clientHeight",R="clientWidth";if(z===ce(t)&&(z=Ae(t),Ne(z).position!=="static"&&a==="absolute"&&(H="scrollHeight",R="scrollWidth")),z=z,r===de||(r===pe||r===me)&&o===bt){T=ge;var L=d&&z===K&&K.visualViewport?K.visualViewport.height:z[H];v-=L-i.height,v*=l?1:-1}if(r===pe||(r===de||r===ge)&&o===bt){w=me;var j=d&&z===K&&K.visualViewport?K.visualViewport.width:z[R];y-=j-i.width,y*=l?1:-1}}var Y=Object.assign({position:a},c&&wu),Q=u===!0?xu({x:y,y:v},ce(t)):{x:y,y:v};if(y=Q.x,v=Q.y,l){var Z;return Object.assign({},Y,(Z={},Z[T]=D?"0":"",Z[w]=C?"0":"",Z.transform=(K.devicePixelRatio||1)<=1?"translate("+y+"px, "+v+"px)":"translate3d("+y+"px, "+v+"px, 0)",Z))}return Object.assign({},Y,(e={},e[T]=D?v+"px":"",e[w]=C?y+"px":"",e.transform="",e))}function Tu(n){var e=n.state,t=n.options,i=t.gpuAcceleration,r=i===void 0?!0:i,o=t.adaptive,s=o===void 0?!0:o,a=t.roundOffsets,l=a===void 0?!0:a,c={placement:Te(e.placement),variation:Ke(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:r,isFixed:e.options.strategy==="fixed"};e.modifiersData.popperOffsets!=null&&(e.styles.popper=Object.assign({},e.styles.popper,Ls(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:s,roundOffsets:l})))),e.modifiersData.arrow!=null&&(e.styles.arrow=Object.assign({},e.styles.arrow,Ls(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})}var gn={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:Tu,data:{}};var Ri={passive:!0};function Cu(n){var e=n.state,t=n.instance,i=n.options,r=i.scroll,o=r===void 0?!0:r,s=i.resize,a=s===void 0?!0:s,l=ce(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach(function(u){u.addEventListener("scroll",t.update,Ri)}),a&&l.addEventListener("resize",t.update,Ri),function(){o&&c.forEach(function(u){u.removeEventListener("scroll",t.update,Ri)}),a&&l.removeEventListener("resize",t.update,Ri)}}var vn={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:Cu,data:{}};var Au={left:"right",right:"left",bottom:"top",top:"bottom"};function yn(n){return n.replace(/left|right|bottom|top/g,function(e){return Au[e]})}var Su={start:"end",end:"start"};function Ii(n){return n.replace(/start|end/g,function(e){return Su[e]})}function Wt(n){var e=ce(n),t=e.pageXOffset,i=e.pageYOffset;return{scrollLeft:t,scrollTop:i}}function qt(n){return Ge(Ae(n)).left+Wt(n).scrollLeft}function Zr(n,e){var t=ce(n),i=Ae(n),r=t.visualViewport,o=i.clientWidth,s=i.clientHeight,a=0,l=0;if(r){o=r.width,s=r.height;var c=Yn();(c||!c&&e==="fixed")&&(a=r.offsetLeft,l=r.offsetTop)}return{width:o,height:s,x:a+qt(n),y:l}}function eo(n){var e,t=Ae(n),i=Wt(n),r=(e=n.ownerDocument)==null?void 0:e.body,o=Ze(t.scrollWidth,t.clientWidth,r?r.scrollWidth:0,r?r.clientWidth:0),s=Ze(t.scrollHeight,t.clientHeight,r?r.scrollHeight:0,r?r.clientHeight:0),a=-i.scrollLeft+qt(n),l=-i.scrollTop;return Ne(r||t).direction==="rtl"&&(a+=Ze(t.clientWidth,r?r.clientWidth:0)-o),{width:o,height:s,x:a,y:l}}function Ut(n){var e=Ne(n),t=e.overflow,i=e.overflowX,r=e.overflowY;return/auto|scroll|overlay|hidden/.test(t+r+i)}function Pi(n){return["html","body","#document"].indexOf(xe(n))>=0?n.ownerDocument.body:_e(n)&&Ut(n)?n:Pi(ut(n))}function _t(n,e){var t;e===void 0&&(e=[]);var i=Pi(n),r=i===((t=n.ownerDocument)==null?void 0:t.body),o=ce(i),s=r?[o].concat(o.visualViewport||[],Ut(i)?i:[]):i,a=e.concat(s);return r?a:a.concat(_t(ut(s)))}function En(n){return Object.assign({},n,{left:n.x,top:n.y,right:n.x+n.width,bottom:n.y+n.height})}function Du(n,e){var t=Ge(n,!1,e==="fixed");return t.top=t.top+n.clientTop,t.left=t.left+n.clientLeft,t.bottom=t.top+n.clientHeight,t.right=t.left+n.clientWidth,t.width=n.clientWidth,t.height=n.clientHeight,t.x=t.left,t.y=t.top,t}function Ms(n,e,t){return e===qn?En(Zr(n,t)):Ye(e)?Du(e,t):En(eo(Ae(n)))}function Ou(n){var e=_t(ut(n)),t=["absolute","fixed"].indexOf(Ne(n).position)>=0,i=t&&_e(n)?et(n):n;return Ye(i)?e.filter(function(r){return Ye(r)&&Gn(r,i)&&xe(r)!=="body"}):[]}function to(n,e,t,i){var r=e==="clippingParents"?Ou(n):[].concat(e),o=[].concat(r,[t]),s=o[0],a=o.reduce(function(l,c){var u=Ms(n,c,i);return l.top=Ze(u.top,l.top),l.right=Bt(u.right,l.right),l.bottom=Bt(u.bottom,l.bottom),l.left=Ze(u.left,l.left),l},Ms(n,s,i));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}function Jn(n){var e=n.reference,t=n.element,i=n.placement,r=i?Te(i):null,o=i?Ke(i):null,s=e.x+e.width/2-t.width/2,a=e.y+e.height/2-t.height/2,l;switch(r){case de:l={x:s,y:e.y-t.height};break;case ge:l={x:s,y:e.y+e.height};break;case me:l={x:e.x+e.width,y:a};break;case pe:l={x:e.x-t.width,y:a};break;default:l={x:e.x,y:e.y}}var c=r?zt(r):null;if(c!=null){var u=c==="y"?"height":"width";switch(o){case rt:l[c]=l[c]-(e[u]/2-t[u]/2);break;case bt:l[c]=l[c]+(e[u]/2-t[u]/2);break;default:}}return l}function ke(n,e){e===void 0&&(e={});var t=e,i=t.placement,r=i===void 0?n.placement:i,o=t.strategy,s=o===void 0?n.strategy:o,a=t.boundary,l=a===void 0?Kr:a,c=t.rootBoundary,u=c===void 0?qn:c,d=t.elementContext,p=d===void 0?$t:d,y=t.altBoundary,m=y===void 0?!1:y,v=t.padding,_=v===void 0?0:v,C=Xn(typeof _!="number"?_:Qn(_,lt)),D=p===$t?Xr:$t,w=n.rects.popper,T=n.elements[m?D:p],K=to(Ye(T)?T:T.contextElement||Ae(n.elements.popper),l,u,s),z=Ge(n.elements.reference),H=Jn({reference:z,element:w,strategy:"absolute",placement:r}),R=En(Object.assign({},w,H)),L=p===$t?R:z,j={top:K.top-L.top+C.top,bottom:L.bottom-K.bottom+C.bottom,left:K.left-L.left+C.left,right:L.right-K.right+C.right},Y=n.modifiersData.offset;if(p===$t&&Y){var Q=Y[r];Object.keys(j).forEach(function(Z){var he=[me,ge].indexOf(Z)>=0?1:-1,Ce=[de,ge].indexOf(Z)>=0?"y":"x";j[Z]+=Q[Ce]*he})}return j}function no(n,e){e===void 0&&(e={});var t=e,i=t.placement,r=t.boundary,o=t.rootBoundary,s=t.padding,a=t.flipVariations,l=t.allowedAutoPlacements,c=l===void 0?Un:l,u=Ke(i),d=u?a?ki:ki.filter(function(m){return Ke(m)===u}):lt,p=d.filter(function(m){return c.indexOf(m)>=0});p.length===0&&(p=d);var y=p.reduce(function(m,v){return m[v]=ke(n,{placement:v,boundary:r,rootBoundary:o,padding:s})[Te(v)],m},{});return Object.keys(y).sort(function(m,v){return y[m]-y[v]})}function Lu(n){if(Te(n)===Wn)return[];var e=yn(n);return[Ii(n),e,Ii(e)]}function Mu(n){var e=n.state,t=n.options,i=n.name;if(!e.modifiersData[i]._skip){for(var r=t.mainAxis,o=r===void 0?!0:r,s=t.altAxis,a=s===void 0?!0:s,l=t.fallbackPlacements,c=t.padding,u=t.boundary,d=t.rootBoundary,p=t.altBoundary,y=t.flipVariations,m=y===void 0?!0:y,v=t.allowedAutoPlacements,_=e.options.placement,C=Te(_),D=C===_,w=l||(D||!m?[yn(_)]:Lu(_)),T=[_].concat(w).reduce(function(B,q){return B.concat(Te(q)===Wn?no(e,{placement:q,boundary:u,rootBoundary:d,padding:c,flipVariations:m,allowedAutoPlacements:v}):q)},[]),K=e.rects.reference,z=e.rects.popper,H=new Map,R=!0,L=T[0],j=0;j=0,Ce=he?"width":"height",re=ke(e,{placement:Y,boundary:u,rootBoundary:d,altBoundary:p,padding:c}),ie=he?Z?me:pe:Z?ge:de;K[Ce]>z[Ce]&&(ie=yn(ie));var Ue=yn(ie),Ie=[];if(o&&Ie.push(re[Q]<=0),a&&Ie.push(re[ie]<=0,re[Ue]<=0),Ie.every(function(B){return B})){L=Y,R=!1;break}H.set(Y,Ie)}if(R)for(var W=m?3:1,M=function(q){var U=T.find(function(ee){var se=H.get(ee);if(se)return se.slice(0,q).every(function(Et){return Et})});if(U)return L=U,"break"},S=W;S>0;S--){var $=M(S);if($==="break")break}e.placement!==L&&(e.modifiersData[i]._skip=!0,e.placement=L,e.reset=!0)}}var Fi={name:"flip",enabled:!0,phase:"main",fn:Mu,requiresIfExists:["offset"],data:{_skip:!1}};function Ns(n,e,t){return t===void 0&&(t={x:0,y:0}),{top:n.top-e.height-t.y,right:n.right-e.width+t.x,bottom:n.bottom-e.height+t.y,left:n.left-e.width-t.x}}function ks(n){return[de,me,ge,pe].some(function(e){return n[e]>=0})}function Nu(n){var e=n.state,t=n.name,i=e.rects.reference,r=e.rects.popper,o=e.modifiersData.preventOverflow,s=ke(e,{elementContext:"reference"}),a=ke(e,{altBoundary:!0}),l=Ns(s,i),c=Ns(a,r,o),u=ks(l),d=ks(c);e.modifiersData[t]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:u,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":u,"data-popper-escaped":d})}var $i={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:Nu};function ku(n,e,t){var i=Te(n),r=[pe,de].indexOf(i)>=0?-1:1,o=typeof t=="function"?t(Object.assign({},e,{placement:n})):t,s=o[0],a=o[1];return s=s||0,a=(a||0)*r,[pe,me].indexOf(i)>=0?{x:a,y:s}:{x:s,y:a}}function Hu(n){var e=n.state,t=n.options,i=n.name,r=t.offset,o=r===void 0?[0,0]:r,s=Un.reduce(function(u,d){return u[d]=ku(d,e.rects,o),u},{}),a=s[e.placement],l=a.x,c=a.y;e.modifiersData.popperOffsets!=null&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[i]=s}var Bi={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:Hu};function Ru(n){var e=n.state,t=n.name;e.modifiersData[t]=Jn({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})}var bn={name:"popperOffsets",enabled:!0,phase:"read",fn:Ru,data:{}};function io(n){return n==="x"?"y":"x"}function Iu(n){var e=n.state,t=n.options,i=n.name,r=t.mainAxis,o=r===void 0?!0:r,s=t.altAxis,a=s===void 0?!1:s,l=t.boundary,c=t.rootBoundary,u=t.altBoundary,d=t.padding,p=t.tether,y=p===void 0?!0:p,m=t.tetherOffset,v=m===void 0?0:m,_=ke(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:u}),C=Te(e.placement),D=Ke(e.placement),w=!D,T=zt(C),K=io(T),z=e.modifiersData.popperOffsets,H=e.rects.reference,R=e.rects.popper,L=typeof v=="function"?v(Object.assign({},e.rects,{placement:e.placement})):v,j=typeof L=="number"?{mainAxis:L,altAxis:L}:Object.assign({mainAxis:0,altAxis:0},L),Y=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,Q={x:0,y:0};if(z){if(o){var Z,he=T==="y"?de:pe,Ce=T==="y"?ge:me,re=T==="y"?"height":"width",ie=z[T],Ue=ie+_[he],Ie=ie-_[Ce],W=y?-R[re]/2:0,M=D===rt?H[re]:R[re],S=D===rt?-R[re]:-H[re],$=e.elements.arrow,B=y&&$?Vt($):{width:0,height:0},q=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:Kn(),U=q[he],ee=q[Ce],se=jt(0,H[re],B[re]),Et=w?H[re]/2-W-se-U-j.mainAxis:M-se-U-j.mainAxis,zr=w?-H[re]/2+W+se+ee+j.mainAxis:S+se+ee+j.mainAxis,sn=e.elements.arrow&&et(e.elements.arrow),an=sn?T==="y"?sn.clientTop||0:sn.clientLeft||0:0,Ci=(Z=Y==null?void 0:Y[T])!=null?Z:0,jr=ie+Et-Ci-an,Ai=ie+zr-Ci,Si=jt(y?Bt(Ue,jr):Ue,ie,y?Ze(Ie,Ai):Ie);z[T]=Si,Q[T]=Si-ie}if(a){var Bn,Di=T==="x"?de:pe,ln=T==="x"?ge:me,ot=z[K],cn=K==="y"?"height":"width",Vn=ot+_[Di],un=ot-_[ln],dn=[de,pe].indexOf(C)!==-1,Ft=(Bn=Y==null?void 0:Y[K])!=null?Bn:0,Oi=dn?Vn:ot-H[cn]-R[cn]-Ft+j.altAxis,zn=dn?ot+H[cn]+R[cn]-Ft-j.altAxis:un,Li=y&&dn?Os(Oi,ot,zn):jt(y?Oi:Vn,ot,y?zn:un);z[K]=Li,Q[K]=Li-ot}e.modifiersData[i]=Q}}var Vi={name:"preventOverflow",enabled:!0,phase:"main",fn:Iu,requiresIfExists:["offset"]};function ro(n){return{scrollLeft:n.scrollLeft,scrollTop:n.scrollTop}}function oo(n){return n===ce(n)||!_e(n)?Wt(n):ro(n)}function Pu(n){var e=n.getBoundingClientRect(),t=ct(e.width)/n.offsetWidth||1,i=ct(e.height)/n.offsetHeight||1;return t!==1||i!==1}function so(n,e,t){t===void 0&&(t=!1);var i=_e(e),r=_e(e)&&Pu(e),o=Ae(e),s=Ge(n,r,t),a={scrollLeft:0,scrollTop:0},l={x:0,y:0};return(i||!i&&!t)&&((xe(e)!=="body"||Ut(o))&&(a=oo(e)),_e(e)?(l=Ge(e,!0),l.x+=e.clientLeft,l.y+=e.clientTop):o&&(l.x=qt(o))),{x:s.left+a.scrollLeft-l.x,y:s.top+a.scrollTop-l.y,width:s.width,height:s.height}}function Fu(n){var e=new Map,t=new Set,i=[];n.forEach(function(o){e.set(o.name,o)});function r(o){t.add(o.name);var s=[].concat(o.requires||[],o.requiresIfExists||[]);s.forEach(function(a){if(!t.has(a)){var l=e.get(a);l&&r(l)}}),i.push(o)}return n.forEach(function(o){t.has(o.name)||r(o)}),i}function ao(n){var e=Fu(n);return Qr.reduce(function(t,i){return t.concat(e.filter(function(r){return r.phase===i}))},[])}function lo(n){var e;return function(){return e||(e=new Promise(function(t){Promise.resolve().then(function(){e=void 0,t(n())})})),e}}function co(n){var e=n.reduce(function(t,i){var r=t[i.name];return t[i.name]=r?Object.assign({},r,i,{options:Object.assign({},r.options,i.options),data:Object.assign({},r.data,i.data)}):i,t},{});return Object.keys(e).map(function(t){return e[t]})}var Hs={placement:"bottom",modifiers:[],strategy:"absolute"};function Rs(){for(var n=arguments.length,e=new Array(n),t=0;t(n&&window.CSS&&window.CSS.escape&&(n=n.replace(/#([^\s"#']+)/g,(e,t)=>`#${CSS.escape(t)}`)),n),ju=n=>n==null?`${n}`:Object.prototype.toString.call(n).match(/\s([a-z]+)/i)[1].toLowerCase(),Wu=n=>{do n+=Math.floor(Math.random()*Vu);while(document.getElementById(n));return n},qu=n=>{if(!n)return 0;let{transitionDuration:e,transitionDelay:t}=window.getComputedStyle(n),i=Number.parseFloat(e),r=Number.parseFloat(t);return!i&&!r?0:(e=e.split(",")[0],t=t.split(",")[0],(Number.parseFloat(e)+Number.parseFloat(t))*zu)},ha=n=>{n.dispatchEvent(new Event(So))},dt=n=>!n||typeof n!="object"?!1:(typeof n.jquery!="undefined"&&(n=n[0]),typeof n.nodeType!="undefined"),xt=n=>dt(n)?n.jquery?n[0]:n:typeof n=="string"&&n.length>0?document.querySelector(fa(n)):null,Sn=n=>{if(!dt(n)||n.getClientRects().length===0)return!1;let e=getComputedStyle(n).getPropertyValue("visibility")==="visible",t=n.closest("details:not([open])");if(!t)return e;if(t!==n){let i=n.closest("summary");if(i&&i.parentNode!==t||i===null)return!1}return e},Tt=n=>!n||n.nodeType!==Node.ELEMENT_NODE||n.classList.contains("disabled")?!0:typeof n.disabled!="undefined"?n.disabled:n.hasAttribute("disabled")&&n.getAttribute("disabled")!=="false",pa=n=>{if(!document.documentElement.attachShadow)return null;if(typeof n.getRootNode=="function"){let e=n.getRootNode();return e instanceof ShadowRoot?e:null}return n instanceof ShadowRoot?n:n.parentNode?pa(n.parentNode):null},Qi=()=>{},ri=n=>{n.offsetHeight},ma=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,fo=[],Uu=n=>{document.readyState==="loading"?(fo.length||document.addEventListener("DOMContentLoaded",()=>{for(let e of fo)e()}),fo.push(n)):n()},Xe=()=>document.documentElement.dir==="rtl",Je=n=>{Uu(()=>{let e=ma();if(e){let t=n.NAME,i=e.fn[t];e.fn[t]=n.jQueryInterface,e.fn[t].Constructor=n,e.fn[t].noConflict=()=>(e.fn[t]=i,n.jQueryInterface)}})},Pe=(n,e=[],t=n)=>typeof n=="function"?n.call(...e):t,ga=(n,e,t=!0)=>{if(!t){Pe(n);return}let r=qu(e)+5,o=!1,s=({target:a})=>{a===e&&(o=!0,e.removeEventListener(So,s),Pe(n))};e.addEventListener(So,s),setTimeout(()=>{o||ha(e)},r)},Mo=(n,e,t,i)=>{let r=n.length,o=n.indexOf(e);return o===-1?!t&&i?n[r-1]:n[0]:(o+=t?1:-1,i&&(o=(o+r)%r),n[Math.max(0,Math.min(o,r-1))])},Yu=/[^.]*(?=\..*)\.|.*/,Gu=/\..*/,Ku=/::\d+$/,ho={},Fs=1,va={mouseenter:"mouseover",mouseleave:"mouseout"},Xu=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function ya(n,e){return e&&`${e}::${Fs++}`||n.uidEvent||Fs++}function Ea(n){let e=ya(n);return n.uidEvent=e,ho[e]=ho[e]||{},ho[e]}function Qu(n,e){return function t(i){return No(i,{delegateTarget:n}),t.oneOff&&x.off(n,i.type,e),e.apply(n,[i])}}function Ju(n,e,t){return function i(r){let o=n.querySelectorAll(e);for(let{target:s}=r;s&&s!==this;s=s.parentNode)for(let a of o)if(a===s)return No(r,{delegateTarget:s}),i.oneOff&&x.off(n,r.type,e,t),t.apply(s,[r])}}function ba(n,e,t=null){return Object.values(n).find(i=>i.callable===e&&i.delegationSelector===t)}function _a(n,e,t){let i=typeof e=="string",r=i?t:e||t,o=wa(n);return Xu.has(o)||(o=n),[i,r,o]}function $s(n,e,t,i,r){if(typeof e!="string"||!n)return;let[o,s,a]=_a(e,t,i);e in va&&(s=(m=>function(v){if(!v.relatedTarget||v.relatedTarget!==v.delegateTarget&&!v.delegateTarget.contains(v.relatedTarget))return m.call(this,v)})(s));let l=Ea(n),c=l[a]||(l[a]={}),u=ba(c,s,o?t:null);if(u){u.oneOff=u.oneOff&&r;return}let d=ya(s,e.replace(Yu,"")),p=o?Ju(n,t,s):Qu(n,s);p.delegationSelector=o?t:null,p.callable=s,p.oneOff=r,p.uidEvent=d,c[d]=p,n.addEventListener(a,p,o)}function Do(n,e,t,i,r){let o=ba(e[t],i,r);o&&(n.removeEventListener(t,o,!!r),delete e[t][o.uidEvent])}function Zu(n,e,t,i){let r=e[t]||{};for(let[o,s]of Object.entries(r))o.includes(i)&&Do(n,e,t,s.callable,s.delegationSelector)}function wa(n){return n=n.replace(Gu,""),va[n]||n}var x={on(n,e,t,i){$s(n,e,t,i,!1)},one(n,e,t,i){$s(n,e,t,i,!0)},off(n,e,t,i){if(typeof e!="string"||!n)return;let[r,o,s]=_a(e,t,i),a=s!==e,l=Ea(n),c=l[s]||{},u=e.startsWith(".");if(typeof o!="undefined"){if(!Object.keys(c).length)return;Do(n,l,s,o,r?t:null);return}if(u)for(let d of Object.keys(l))Zu(n,l,d,e.slice(1));for(let[d,p]of Object.entries(c)){let y=d.replace(Ku,"");(!a||e.includes(y))&&Do(n,l,s,p.callable,p.delegationSelector)}},trigger(n,e,t){if(typeof e!="string"||!n)return null;let i=ma(),r=wa(e),o=e!==r,s=null,a=!0,l=!0,c=!1;o&&i&&(s=i.Event(e,t),i(n).trigger(s),a=!s.isPropagationStopped(),l=!s.isImmediatePropagationStopped(),c=s.isDefaultPrevented());let u=No(new Event(e,{bubbles:a,cancelable:!0}),t);return c&&u.preventDefault(),l&&n.dispatchEvent(u),u.defaultPrevented&&s&&s.preventDefault(),u}};function No(n,e={}){for(let[t,i]of Object.entries(e))try{n[t]=i}catch(r){Object.defineProperty(n,t,{configurable:!0,get(){return i}})}return n}function Bs(n){if(n==="true")return!0;if(n==="false")return!1;if(n===Number(n).toString())return Number(n);if(n===""||n==="null")return null;if(typeof n!="string")return n;try{return JSON.parse(decodeURIComponent(n))}catch(e){return n}}function po(n){return n.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`)}var ft={setDataAttribute(n,e,t){n.setAttribute(`data-bs-${po(e)}`,t)},removeDataAttribute(n,e){n.removeAttribute(`data-bs-${po(e)}`)},getDataAttributes(n){if(!n)return{};let e={},t=Object.keys(n.dataset).filter(i=>i.startsWith("bs")&&!i.startsWith("bsConfig"));for(let i of t){let r=i.replace(/^bs/,"");r=r.charAt(0).toLowerCase()+r.slice(1),e[r]=Bs(n.dataset[i])}return e},getDataAttribute(n,e){return Bs(n.getAttribute(`data-bs-${po(e)}`))}},Xt=class{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(e){return e=this._mergeConfigObj(e),e=this._configAfterMerge(e),this._typeCheckConfig(e),e}_configAfterMerge(e){return e}_mergeConfigObj(e,t){let i=dt(t)?ft.getDataAttribute(t,"config"):{};return O(O(O(O({},this.constructor.Default),typeof i=="object"?i:{}),dt(t)?ft.getDataAttributes(t):{}),typeof e=="object"?e:{})}_typeCheckConfig(e,t=this.constructor.DefaultType){for(let[i,r]of Object.entries(t)){let o=e[i],s=dt(o)?"element":ju(o);if(!new RegExp(r).test(s))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${i}" provided type "${s}" but expected type "${r}".`)}}},ed="5.3.8",qe=class extends Xt{constructor(e,t){super(),e=xt(e),e&&(this._element=e,this._config=this._getConfig(t),uo.set(this._element,this.constructor.DATA_KEY,this))}dispose(){uo.remove(this._element,this.constructor.DATA_KEY),x.off(this._element,this.constructor.EVENT_KEY);for(let e of Object.getOwnPropertyNames(this))this[e]=null}_queueCallback(e,t,i=!0){ga(e,t,i)}_getConfig(e){return e=this._mergeConfigObj(e,this._element),e=this._configAfterMerge(e),this._typeCheckConfig(e),e}static getInstance(e){return uo.get(xt(e),this.DATA_KEY)}static getOrCreateInstance(e,t={}){return this.getInstance(e)||new this(e,typeof t=="object"?t:null)}static get VERSION(){return ed}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(e){return`${e}${this.EVENT_KEY}`}},mo=n=>{let e=n.getAttribute("data-bs-target");if(!e||e==="#"){let t=n.getAttribute("href");if(!t||!t.includes("#")&&!t.startsWith("."))return null;t.includes("#")&&!t.startsWith("#")&&(t=`#${t.split("#")[1]}`),e=t&&t!=="#"?t.trim():null}return e?e.split(",").map(t=>fa(t)).join(","):null},V={find(n,e=document.documentElement){return[].concat(...Element.prototype.querySelectorAll.call(e,n))},findOne(n,e=document.documentElement){return Element.prototype.querySelector.call(e,n)},children(n,e){return[].concat(...n.children).filter(t=>t.matches(e))},parents(n,e){let t=[],i=n.parentNode.closest(e);for(;i;)t.push(i),i=i.parentNode.closest(e);return t},prev(n,e){let t=n.previousElementSibling;for(;t;){if(t.matches(e))return[t];t=t.previousElementSibling}return[]},next(n,e){let t=n.nextElementSibling;for(;t;){if(t.matches(e))return[t];t=t.nextElementSibling}return[]},focusableChildren(n){let e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map(t=>`${t}:not([tabindex^="-"])`).join(",");return this.find(e,n).filter(t=>!Tt(t)&&Sn(t))},getSelectorFromElement(n){let e=mo(n);return e&&V.findOne(e)?e:null},getElementFromSelector(n){let e=mo(n);return e?V.findOne(e):null},getMultipleElementsFromSelector(n){let e=mo(n);return e?V.find(e):[]}},or=(n,e="hide")=>{let t=`click.dismiss${n.EVENT_KEY}`,i=n.NAME;x.on(document,t,`[data-bs-dismiss="${i}"]`,function(r){if(["A","AREA"].includes(this.tagName)&&r.preventDefault(),Tt(this))return;let o=V.getElementFromSelector(this)||this.closest(`.${i}`);n.getOrCreateInstance(o)[e]()})},td="alert",nd="bs.alert",xa=`.${nd}`,id=`close${xa}`,rd=`closed${xa}`,od="fade",sd="show",Ji=class n extends qe{static get NAME(){return td}close(){if(x.trigger(this._element,id).defaultPrevented)return;this._element.classList.remove(sd);let t=this._element.classList.contains(od);this._queueCallback(()=>this._destroyElement(),this._element,t)}_destroyElement(){this._element.remove(),x.trigger(this._element,rd),this.dispose()}static jQueryInterface(e){return this.each(function(){let t=n.getOrCreateInstance(this);if(typeof e=="string"){if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e](this)}})}};or(Ji,"close");Je(Ji);var ad="button",ld="bs.button",cd=`.${ld}`,ud=".data-api",dd="active",Vs='[data-bs-toggle="button"]',fd=`click${cd}${ud}`,Zi=class n extends qe{static get NAME(){return ad}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle(dd))}static jQueryInterface(e){return this.each(function(){let t=n.getOrCreateInstance(this);e==="toggle"&&t[e]()})}};x.on(document,fd,Vs,n=>{n.preventDefault();let e=n.target.closest(Vs);Zi.getOrCreateInstance(e).toggle()});Je(Zi);var hd="swipe",Dn=".bs.swipe",pd=`touchstart${Dn}`,md=`touchmove${Dn}`,gd=`touchend${Dn}`,vd=`pointerdown${Dn}`,yd=`pointerup${Dn}`,Ed="touch",bd="pen",_d="pointer-event",wd=40,xd={endCallback:null,leftCallback:null,rightCallback:null},Td={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"},er=class n extends Xt{constructor(e,t){super(),this._element=e,!(!e||!n.isSupported())&&(this._config=this._getConfig(t),this._deltaX=0,this._supportPointerEvents=!!window.PointerEvent,this._initEvents())}static get Default(){return xd}static get DefaultType(){return Td}static get NAME(){return hd}dispose(){x.off(this._element,Dn)}_start(e){if(!this._supportPointerEvents){this._deltaX=e.touches[0].clientX;return}this._eventIsPointerPenTouch(e)&&(this._deltaX=e.clientX)}_end(e){this._eventIsPointerPenTouch(e)&&(this._deltaX=e.clientX-this._deltaX),this._handleSwipe(),Pe(this._config.endCallback)}_move(e){this._deltaX=e.touches&&e.touches.length>1?0:e.touches[0].clientX-this._deltaX}_handleSwipe(){let e=Math.abs(this._deltaX);if(e<=wd)return;let t=e/this._deltaX;this._deltaX=0,t&&Pe(t>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(x.on(this._element,vd,e=>this._start(e)),x.on(this._element,yd,e=>this._end(e)),this._element.classList.add(_d)):(x.on(this._element,pd,e=>this._start(e)),x.on(this._element,md,e=>this._move(e)),x.on(this._element,gd,e=>this._end(e)))}_eventIsPointerPenTouch(e){return this._supportPointerEvents&&(e.pointerType===bd||e.pointerType===Ed)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}},Cd="carousel",Ad="bs.carousel",Dt=`.${Ad}`,Ta=".data-api",Sd="ArrowLeft",Dd="ArrowRight",Od=500,ei="next",_n="prev",xn="left",Ki="right",Ld=`slide${Dt}`,go=`slid${Dt}`,Md=`keydown${Dt}`,Nd=`mouseenter${Dt}`,kd=`mouseleave${Dt}`,Hd=`dragstart${Dt}`,Rd=`load${Dt}${Ta}`,Id=`click${Dt}${Ta}`,Ca="carousel",ji="active",Pd="slide",Fd="carousel-item-end",$d="carousel-item-start",Bd="carousel-item-next",Vd="carousel-item-prev",Aa=".active",Sa=".carousel-item",zd=Aa+Sa,jd=".carousel-item img",Wd=".carousel-indicators",qd="[data-bs-slide], [data-bs-slide-to]",Ud='[data-bs-ride="carousel"]',Yd={[Sd]:Ki,[Dd]:xn},Gd={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},Kd={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"},ni=class n extends qe{constructor(e,t){super(e,t),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=V.findOne(Wd,this._element),this._addEventListeners(),this._config.ride===Ca&&this.cycle()}static get Default(){return Gd}static get DefaultType(){return Kd}static get NAME(){return Cd}next(){this._slide(ei)}nextWhenVisible(){!document.hidden&&Sn(this._element)&&this.next()}prev(){this._slide(_n)}pause(){this._isSliding&&ha(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval(()=>this.nextWhenVisible(),this._config.interval)}_maybeEnableCycle(){if(this._config.ride){if(this._isSliding){x.one(this._element,go,()=>this.cycle());return}this.cycle()}}to(e){let t=this._getItems();if(e>t.length-1||e<0)return;if(this._isSliding){x.one(this._element,go,()=>this.to(e));return}let i=this._getItemIndex(this._getActive());if(i===e)return;let r=e>i?ei:_n;this._slide(r,t[e])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(e){return e.defaultInterval=e.interval,e}_addEventListeners(){this._config.keyboard&&x.on(this._element,Md,e=>this._keydown(e)),this._config.pause==="hover"&&(x.on(this._element,Nd,()=>this.pause()),x.on(this._element,kd,()=>this._maybeEnableCycle())),this._config.touch&&er.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(let i of V.find(jd,this._element))x.on(i,Hd,r=>r.preventDefault());let t={leftCallback:()=>this._slide(this._directionToOrder(xn)),rightCallback:()=>this._slide(this._directionToOrder(Ki)),endCallback:()=>{this._config.pause==="hover"&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(()=>this._maybeEnableCycle(),Od+this._config.interval))}};this._swipeHelper=new er(this._element,t)}_keydown(e){if(/input|textarea/i.test(e.target.tagName))return;let t=Yd[e.key];t&&(e.preventDefault(),this._slide(this._directionToOrder(t)))}_getItemIndex(e){return this._getItems().indexOf(e)}_setActiveIndicatorElement(e){if(!this._indicatorsElement)return;let t=V.findOne(Aa,this._indicatorsElement);t.classList.remove(ji),t.removeAttribute("aria-current");let i=V.findOne(`[data-bs-slide-to="${e}"]`,this._indicatorsElement);i&&(i.classList.add(ji),i.setAttribute("aria-current","true"))}_updateInterval(){let e=this._activeElement||this._getActive();if(!e)return;let t=Number.parseInt(e.getAttribute("data-bs-interval"),10);this._config.interval=t||this._config.defaultInterval}_slide(e,t=null){if(this._isSliding)return;let i=this._getActive(),r=e===ei,o=t||Mo(this._getItems(),i,r,this._config.wrap);if(o===i)return;let s=this._getItemIndex(o),a=y=>x.trigger(this._element,y,{relatedTarget:o,direction:this._orderToDirection(e),from:this._getItemIndex(i),to:s});if(a(Ld).defaultPrevented||!i||!o)return;let c=!!this._interval;this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(s),this._activeElement=o;let u=r?$d:Fd,d=r?Bd:Vd;o.classList.add(d),ri(o),i.classList.add(u),o.classList.add(u);let p=()=>{o.classList.remove(u,d),o.classList.add(ji),i.classList.remove(ji,d,u),this._isSliding=!1,a(go)};this._queueCallback(p,i,this._isAnimated()),c&&this.cycle()}_isAnimated(){return this._element.classList.contains(Pd)}_getActive(){return V.findOne(zd,this._element)}_getItems(){return V.find(Sa,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(e){return Xe()?e===xn?_n:ei:e===xn?ei:_n}_orderToDirection(e){return Xe()?e===_n?xn:Ki:e===_n?Ki:xn}static jQueryInterface(e){return this.each(function(){let t=n.getOrCreateInstance(this,e);if(typeof e=="number"){t.to(e);return}if(typeof e=="string"){if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e]()}})}};x.on(document,Id,qd,function(n){let e=V.getElementFromSelector(this);if(!e||!e.classList.contains(Ca))return;n.preventDefault();let t=ni.getOrCreateInstance(e),i=this.getAttribute("data-bs-slide-to");if(i){t.to(i),t._maybeEnableCycle();return}if(ft.getDataAttribute(this,"slide")==="next"){t.next(),t._maybeEnableCycle();return}t.prev(),t._maybeEnableCycle()});x.on(window,Rd,()=>{let n=V.find(Ud);for(let e of n)ni.getOrCreateInstance(e)});Je(ni);var Xd="collapse",Qd="bs.collapse",oi=`.${Qd}`,Jd=".data-api",Zd=`show${oi}`,ef=`shown${oi}`,tf=`hide${oi}`,nf=`hidden${oi}`,rf=`click${oi}${Jd}`,vo="show",Cn="collapse",Wi="collapsing",of="collapsed",sf=`:scope .${Cn} .${Cn}`,af="collapse-horizontal",lf="width",cf="height",uf=".collapse.show, .collapse.collapsing",Oo='[data-bs-toggle="collapse"]',df={parent:null,toggle:!0},ff={parent:"(null|element)",toggle:"boolean"},Ct=class n extends qe{constructor(e,t){super(e,t),this._isTransitioning=!1,this._triggerArray=[];let i=V.find(Oo);for(let r of i){let o=V.getSelectorFromElement(r),s=V.find(o).filter(a=>a===this._element);o!==null&&s.length&&this._triggerArray.push(r)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return df}static get DefaultType(){return ff}static get NAME(){return Xd}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let e=[];if(this._config.parent&&(e=this._getFirstLevelChildren(uf).filter(a=>a!==this._element).map(a=>n.getOrCreateInstance(a,{toggle:!1}))),e.length&&e[0]._isTransitioning||x.trigger(this._element,Zd).defaultPrevented)return;for(let a of e)a.hide();let i=this._getDimension();this._element.classList.remove(Cn),this._element.classList.add(Wi),this._element.style[i]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;let r=()=>{this._isTransitioning=!1,this._element.classList.remove(Wi),this._element.classList.add(Cn,vo),this._element.style[i]="",x.trigger(this._element,ef)},s=`scroll${i[0].toUpperCase()+i.slice(1)}`;this._queueCallback(r,this._element,!0),this._element.style[i]=`${this._element[s]}px`}hide(){if(this._isTransitioning||!this._isShown()||x.trigger(this._element,tf).defaultPrevented)return;let t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,ri(this._element),this._element.classList.add(Wi),this._element.classList.remove(Cn,vo);for(let r of this._triggerArray){let o=V.getElementFromSelector(r);o&&!this._isShown(o)&&this._addAriaAndCollapsedClass([r],!1)}this._isTransitioning=!0;let i=()=>{this._isTransitioning=!1,this._element.classList.remove(Wi),this._element.classList.add(Cn),x.trigger(this._element,nf)};this._element.style[t]="",this._queueCallback(i,this._element,!0)}_isShown(e=this._element){return e.classList.contains(vo)}_configAfterMerge(e){return e.toggle=!!e.toggle,e.parent=xt(e.parent),e}_getDimension(){return this._element.classList.contains(af)?lf:cf}_initializeChildren(){if(!this._config.parent)return;let e=this._getFirstLevelChildren(Oo);for(let t of e){let i=V.getElementFromSelector(t);i&&this._addAriaAndCollapsedClass([t],this._isShown(i))}}_getFirstLevelChildren(e){let t=V.find(sf,this._config.parent);return V.find(e,this._config.parent).filter(i=>!t.includes(i))}_addAriaAndCollapsedClass(e,t){if(e.length)for(let i of e)i.classList.toggle(of,!t),i.setAttribute("aria-expanded",t)}static jQueryInterface(e){let t={};return typeof e=="string"&&/show|hide/.test(e)&&(t.toggle=!1),this.each(function(){let i=n.getOrCreateInstance(this,t);if(typeof e=="string"){if(typeof i[e]=="undefined")throw new TypeError(`No method named "${e}"`);i[e]()}})}};x.on(document,rf,Oo,function(n){(n.target.tagName==="A"||n.delegateTarget&&n.delegateTarget.tagName==="A")&&n.preventDefault();for(let e of V.getMultipleElementsFromSelector(this))Ct.getOrCreateInstance(e,{toggle:!1}).toggle()});Je(Ct);var zs="dropdown",hf="bs.dropdown",Jt=`.${hf}`,ko=".data-api",pf="Escape",js="Tab",mf="ArrowUp",Ws="ArrowDown",gf=2,vf=`hide${Jt}`,yf=`hidden${Jt}`,Ef=`show${Jt}`,bf=`shown${Jt}`,Da=`click${Jt}${ko}`,Oa=`keydown${Jt}${ko}`,_f=`keyup${Jt}${ko}`,Tn="show",wf="dropup",xf="dropend",Tf="dropstart",Cf="dropup-center",Af="dropdown-center",Gt='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',Sf=`${Gt}.${Tn}`,Xi=".dropdown-menu",Df=".navbar",Of=".navbar-nav",Lf=".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",Mf=Xe()?"top-end":"top-start",Nf=Xe()?"top-start":"top-end",kf=Xe()?"bottom-end":"bottom-start",Hf=Xe()?"bottom-start":"bottom-end",Rf=Xe()?"left-start":"right-start",If=Xe()?"right-start":"left-start",Pf="top",Ff="bottom",$f={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},Bf={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"},At=class n extends qe{constructor(e,t){super(e,t),this._popper=null,this._parent=this._element.parentNode,this._menu=V.next(this._element,Xi)[0]||V.prev(this._element,Xi)[0]||V.findOne(Xi,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return $f}static get DefaultType(){return Bf}static get NAME(){return zs}toggle(){return this._isShown()?this.hide():this.show()}show(){if(Tt(this._element)||this._isShown())return;let e={relatedTarget:this._element};if(!x.trigger(this._element,Ef,e).defaultPrevented){if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(Of))for(let i of[].concat(...document.body.children))x.on(i,"mouseover",Qi);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(Tn),this._element.classList.add(Tn),x.trigger(this._element,bf,e)}}hide(){if(Tt(this._element)||!this._isShown())return;let e={relatedTarget:this._element};this._completeHide(e)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(e){if(!x.trigger(this._element,vf,e).defaultPrevented){if("ontouchstart"in document.documentElement)for(let i of[].concat(...document.body.children))x.off(i,"mouseover",Qi);this._popper&&this._popper.destroy(),this._menu.classList.remove(Tn),this._element.classList.remove(Tn),this._element.setAttribute("aria-expanded","false"),ft.removeDataAttribute(this._menu,"popper"),x.trigger(this._element,yf,e)}}_getConfig(e){if(e=super._getConfig(e),typeof e.reference=="object"&&!dt(e.reference)&&typeof e.reference.getBoundingClientRect!="function")throw new TypeError(`${zs.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return e}_createPopper(){if(typeof zi=="undefined")throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org/docs/v2/)");let e=this._element;this._config.reference==="parent"?e=this._parent:dt(this._config.reference)?e=xt(this._config.reference):typeof this._config.reference=="object"&&(e=this._config.reference);let t=this._getPopperConfig();this._popper=Zn(e,this._menu,t)}_isShown(){return this._menu.classList.contains(Tn)}_getPlacement(){let e=this._parent;if(e.classList.contains(xf))return Rf;if(e.classList.contains(Tf))return If;if(e.classList.contains(Cf))return Pf;if(e.classList.contains(Af))return Ff;let t=getComputedStyle(this._menu).getPropertyValue("--bs-position").trim()==="end";return e.classList.contains(wf)?t?Nf:Mf:t?Hf:kf}_detectNavbar(){return this._element.closest(Df)!==null}_getOffset(){let{offset:e}=this._config;return typeof e=="string"?e.split(",").map(t=>Number.parseInt(t,10)):typeof e=="function"?t=>e(t,this._element):e}_getPopperConfig(){let e={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||this._config.display==="static")&&(ft.setDataAttribute(this._menu,"popper","static"),e.modifiers=[{name:"applyStyles",enabled:!1}]),O(O({},e),Pe(this._config.popperConfig,[void 0,e]))}_selectMenuItem({key:e,target:t}){let i=V.find(Lf,this._menu).filter(r=>Sn(r));i.length&&Mo(i,t,e===Ws,!i.includes(t)).focus()}static jQueryInterface(e){return this.each(function(){let t=n.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof t[e]=="undefined")throw new TypeError(`No method named "${e}"`);t[e]()}})}static clearMenus(e){if(e.button===gf||e.type==="keyup"&&e.key!==js)return;let t=V.find(Sf);for(let i of t){let r=n.getInstance(i);if(!r||r._config.autoClose===!1)continue;let o=e.composedPath(),s=o.includes(r._menu);if(o.includes(r._element)||r._config.autoClose==="inside"&&!s||r._config.autoClose==="outside"&&s||r._menu.contains(e.target)&&(e.type==="keyup"&&e.key===js||/input|select|option|textarea|form/i.test(e.target.tagName)))continue;let a={relatedTarget:r._element};e.type==="click"&&(a.clickEvent=e),r._completeHide(a)}}static dataApiKeydownHandler(e){let t=/input|textarea/i.test(e.target.tagName),i=e.key===pf,r=[mf,Ws].includes(e.key);if(!r&&!i||t&&!i)return;e.preventDefault();let o=this.matches(Gt)?this:V.prev(this,Gt)[0]||V.next(this,Gt)[0]||V.findOne(Gt,e.delegateTarget.parentNode),s=n.getOrCreateInstance(o);if(r){e.stopPropagation(),s.show(),s._selectMenuItem(e);return}s._isShown()&&(e.stopPropagation(),s.hide(),o.focus())}};x.on(document,Oa,Gt,At.dataApiKeydownHandler);x.on(document,Oa,Xi,At.dataApiKeydownHandler);x.on(document,Da,At.clearMenus);x.on(document,_f,At.clearMenus);x.on(document,Da,Gt,function(n){n.preventDefault(),At.getOrCreateInstance(this).toggle()});Je(At);var La="backdrop",Vf="fade",qs="show",Us=`mousedown.bs.${La}`,zf={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},jf={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"},tr=class extends Xt{constructor(e){super(),this._config=this._getConfig(e),this._isAppended=!1,this._element=null}static get Default(){return zf}static get DefaultType(){return jf}static get NAME(){return La}show(e){if(!this._config.isVisible){Pe(e);return}this._append();let t=this._getElement();this._config.isAnimated&&ri(t),t.classList.add(qs),this._emulateAnimation(()=>{Pe(e)})}hide(e){if(!this._config.isVisible){Pe(e);return}this._getElement().classList.remove(qs),this._emulateAnimation(()=>{this.dispose(),Pe(e)})}dispose(){this._isAppended&&(x.off(this._element,Us),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){let e=document.createElement("div");e.className=this._config.className,this._config.isAnimated&&e.classList.add(Vf),this._element=e}return this._element}_configAfterMerge(e){return e.rootElement=xt(e.rootElement),e}_append(){if(this._isAppended)return;let e=this._getElement();this._config.rootElement.append(e),x.on(e,Us,()=>{Pe(this._config.clickCallback)}),this._isAppended=!0}_emulateAnimation(e){ga(e,this._getElement(),this._config.isAnimated)}},Wf="focustrap",qf="bs.focustrap",nr=`.${qf}`,Uf=`focusin${nr}`,Yf=`keydown.tab${nr}`,Gf="Tab",Kf="forward",Ys="backward",Xf={autofocus:!0,trapElement:null},Qf={autofocus:"boolean",trapElement:"element"},ir=class extends Xt{constructor(e){super(),this._config=this._getConfig(e),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return Xf}static get DefaultType(){return Qf}static get NAME(){return Wf}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),x.off(document,nr),x.on(document,Uf,e=>this._handleFocusin(e)),x.on(document,Yf,e=>this._handleKeydown(e)),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,x.off(document,nr))}_handleFocusin(e){let{trapElement:t}=this._config;if(e.target===document||e.target===t||t.contains(e.target))return;let i=V.focusableChildren(t);i.length===0?t.focus():this._lastTabNavDirection===Ys?i[i.length-1].focus():i[0].focus()}_handleKeydown(e){e.key===Gf&&(this._lastTabNavDirection=e.shiftKey?Ys:Kf)}},Gs=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",Ks=".sticky-top",qi="padding-right",Xs="margin-right",ii=class{constructor(){this._element=document.body}getWidth(){let e=document.documentElement.clientWidth;return Math.abs(window.innerWidth-e)}hide(){let e=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,qi,t=>t+e),this._setElementAttributes(Gs,qi,t=>t+e),this._setElementAttributes(Ks,Xs,t=>t-e)}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,qi),this._resetElementAttributes(Gs,qi),this._resetElementAttributes(Ks,Xs)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(e,t,i){let r=this.getWidth(),o=s=>{if(s!==this._element&&window.innerWidth>s.clientWidth+r)return;this._saveInitialAttribute(s,t);let a=window.getComputedStyle(s).getPropertyValue(t);s.style.setProperty(t,`${i(Number.parseFloat(a))}px`)};this._applyManipulationCallback(e,o)}_saveInitialAttribute(e,t){let i=e.style.getPropertyValue(t);i&&ft.setDataAttribute(e,t,i)}_resetElementAttributes(e,t){let i=r=>{let o=ft.getDataAttribute(r,t);if(o===null){r.style.removeProperty(t);return}ft.removeDataAttribute(r,t),r.style.setProperty(t,o)};this._applyManipulationCallback(e,i)}_applyManipulationCallback(e,t){if(dt(e)){t(e);return}for(let i of V.find(e,this._element))t(i)}},Jf="modal",Zf="bs.modal",Qe=`.${Zf}`,eh=".data-api",th="Escape",nh=`hide${Qe}`,ih=`hidePrevented${Qe}`,Ma=`hidden${Qe}`,Na=`show${Qe}`,rh=`shown${Qe}`,oh=`resize${Qe}`,sh=`click.dismiss${Qe}`,ah=`mousedown.dismiss${Qe}`,lh=`keydown.dismiss${Qe}`,ch=`click${Qe}${eh}`,Qs="modal-open",uh="fade",Js="show",yo="modal-static",dh=".modal.show",fh=".modal-dialog",hh=".modal-body",ph='[data-bs-toggle="modal"]',mh={backdrop:!0,focus:!0,keyboard:!0},gh={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"},tt=class n extends qe{constructor(e,t){super(e,t),this._dialog=V.findOne(fh,this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new ii,this._addEventListeners()}static get Default(){return mh}static get DefaultType(){return gh}static get NAME(){return Jf}toggle(e){return this._isShown?this.hide():this.show(e)}show(e){this._isShown||this._isTransitioning||x.trigger(this._element,Na,{relatedTarget:e}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(Qs),this._adjustDialog(),this._backdrop.show(()=>this._showElement(e)))}hide(){!this._isShown||this._isTransitioning||x.trigger(this._element,nh).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(Js),this._queueCallback(()=>this._hideModal(),this._element,this._isAnimated()))}dispose(){x.off(window,Qe),x.off(this._dialog,Qe),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new tr({isVisible:!!this._config.backdrop,isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new ir({trapElement:this._element})}_showElement(e){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;let t=V.findOne(hh,this._dialog);t&&(t.scrollTop=0),ri(this._element),this._element.classList.add(Js);let i=()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,x.trigger(this._element,rh,{relatedTarget:e})};this._queueCallback(i,this._dialog,this._isAnimated())}_addEventListeners(){x.on(this._element,lh,e=>{if(e.key===th){if(this._config.keyboard){this.hide();return}this._triggerBackdropTransition()}}),x.on(window,oh,()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()}),x.on(this._element,ah,e=>{x.one(this._element,sh,t=>{if(!(this._element!==e.target||this._element!==t.target)){if(this._config.backdrop==="static"){this._triggerBackdropTransition();return}this._config.backdrop&&this.hide()}})})}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide(()=>{document.body.classList.remove(Qs),this._resetAdjustments(),this._scrollBar.reset(),x.trigger(this._element,Ma)})}_isAnimated(){return this._element.classList.contains(uh)}_triggerBackdropTransition(){if(x.trigger(this._element,ih).defaultPrevented)return;let t=this._element.scrollHeight>document.documentElement.clientHeight,i=this._element.style.overflowY;i==="hidden"||this._element.classList.contains(yo)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(yo),this._queueCallback(()=>{this._element.classList.remove(yo),this._queueCallback(()=>{this._element.style.overflowY=i},this._dialog)},this._dialog),this._element.focus())}_adjustDialog(){let e=this._element.scrollHeight>document.documentElement.clientHeight,t=this._scrollBar.getWidth(),i=t>0;if(i&&!e){let r=Xe()?"paddingLeft":"paddingRight";this._element.style[r]=`${t}px`}if(!i&&e){let r=Xe()?"paddingRight":"paddingLeft";this._element.style[r]=`${t}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(e,t){return this.each(function(){let i=n.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof i[e]=="undefined")throw new TypeError(`No method named "${e}"`);i[e](t)}})}};x.on(document,ch,ph,function(n){let e=V.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&n.preventDefault(),x.one(e,Na,r=>{r.defaultPrevented||x.one(e,Ma,()=>{Sn(this)&&this.focus()})});let t=V.findOne(dh);t&&tt.getInstance(t).hide(),tt.getOrCreateInstance(e).toggle(this)});or(tt);Je(tt);var vh="offcanvas",yh="bs.offcanvas",mt=`.${yh}`,ka=".data-api",Eh=`load${mt}${ka}`,bh="Escape",Zs="show",ea="showing",ta="hiding",_h="offcanvas-backdrop",Ha=".offcanvas.show",wh=`show${mt}`,xh=`shown${mt}`,Th=`hide${mt}`,na=`hidePrevented${mt}`,Ra=`hidden${mt}`,Ch=`resize${mt}`,Ah=`click${mt}${ka}`,Sh=`keydown.dismiss${mt}`,Dh='[data-bs-toggle="offcanvas"]',Oh={backdrop:!0,keyboard:!0,scroll:!1},Lh={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"},St=class n extends qe{constructor(e,t){super(e,t),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return Oh}static get DefaultType(){return Lh}static get NAME(){return vh}toggle(e){return this._isShown?this.hide():this.show(e)}show(e){if(this._isShown||x.trigger(this._element,wh,{relatedTarget:e}).defaultPrevented)return;this._isShown=!0,this._backdrop.show(),this._config.scroll||new ii().hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(ea);let i=()=>{(!this._config.scroll||this._config.backdrop)&&this._focustrap.activate(),this._element.classList.add(Zs),this._element.classList.remove(ea),x.trigger(this._element,xh,{relatedTarget:e})};this._queueCallback(i,this._element,!0)}hide(){if(!this._isShown||x.trigger(this._element,Th).defaultPrevented)return;this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(ta),this._backdrop.hide();let t=()=>{this._element.classList.remove(Zs,ta),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||new ii().reset(),x.trigger(this._element,Ra)};this._queueCallback(t,this._element,!0)}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){let e=()=>{if(this._config.backdrop==="static"){x.trigger(this._element,na);return}this.hide()},t=!!this._config.backdrop;return new tr({className:_h,isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?e:null})}_initializeFocusTrap(){return new ir({trapElement:this._element})}_addEventListeners(){x.on(this._element,Sh,e=>{if(e.key===bh){if(this._config.keyboard){this.hide();return}x.trigger(this._element,na)}})}static jQueryInterface(e){return this.each(function(){let t=n.getOrCreateInstance(this,e);if(typeof e=="string"){if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e](this)}})}};x.on(document,Ah,Dh,function(n){let e=V.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&n.preventDefault(),Tt(this))return;x.one(e,Ra,()=>{Sn(this)&&this.focus()});let t=V.findOne(Ha);t&&t!==e&&St.getInstance(t).hide(),St.getOrCreateInstance(e).toggle(this)});x.on(window,Eh,()=>{for(let n of V.find(Ha))St.getOrCreateInstance(n).show()});x.on(window,Ch,()=>{for(let n of V.find("[aria-modal][class*=show][class*=offcanvas-]"))getComputedStyle(n).position!=="fixed"&&St.getOrCreateInstance(n).hide()});or(St);Je(St);var Mh=/^aria-[\w-]*$/i,Ia={"*":["class","dir","id","lang","role",Mh],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],dd:[],div:[],dl:[],dt:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Nh=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),kh=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Hh=(n,e)=>{let t=n.nodeName.toLowerCase();return e.includes(t)?Nh.has(t)?!!kh.test(n.nodeValue):!0:e.filter(i=>i instanceof RegExp).some(i=>i.test(t))};function Rh(n,e,t){if(!n.length)return n;if(t&&typeof t=="function")return t(n);let r=new window.DOMParser().parseFromString(n,"text/html"),o=[].concat(...r.body.querySelectorAll("*"));for(let s of o){let a=s.nodeName.toLowerCase();if(!Object.keys(e).includes(a)){s.remove();continue}let l=[].concat(...s.attributes),c=[].concat(e["*"]||[],e[a]||[]);for(let u of l)Hh(u,c)||s.removeAttribute(u.nodeName)}return r.body.innerHTML}var Ih="TemplateFactory",Ph={allowList:Ia,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"

    "},Fh={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},$h={entry:"(string|element|function|null)",selector:"(string|element)"},Lo=class extends Xt{constructor(e){super(),this._config=this._getConfig(e)}static get Default(){return Ph}static get DefaultType(){return Fh}static get NAME(){return Ih}getContent(){return Object.values(this._config.content).map(e=>this._resolvePossibleFunction(e)).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(e){return this._checkContent(e),this._config.content=O(O({},this._config.content),e),this}toHtml(){let e=document.createElement("div");e.innerHTML=this._maybeSanitize(this._config.template);for(let[r,o]of Object.entries(this._config.content))this._setContent(e,o,r);let t=e.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&t.classList.add(...i.split(" ")),t}_typeCheckConfig(e){super._typeCheckConfig(e),this._checkContent(e.content)}_checkContent(e){for(let[t,i]of Object.entries(e))super._typeCheckConfig({selector:t,entry:i},$h)}_setContent(e,t,i){let r=V.findOne(i,e);if(r){if(t=this._resolvePossibleFunction(t),!t){r.remove();return}if(dt(t)){this._putElementInTemplate(xt(t),r);return}if(this._config.html){r.innerHTML=this._maybeSanitize(t);return}r.textContent=t}}_maybeSanitize(e){return this._config.sanitize?Rh(e,this._config.allowList,this._config.sanitizeFn):e}_resolvePossibleFunction(e){return Pe(e,[void 0,this])}_putElementInTemplate(e,t){if(this._config.html){t.innerHTML="",t.append(e);return}t.textContent=e.textContent}},Bh="tooltip",Vh=new Set(["sanitize","allowList","sanitizeFn"]),Eo="fade",zh="modal",Ui="show",jh=".tooltip-inner",ia=`.${zh}`,ra="hide.bs.modal",ti="hover",bo="focus",_o="click",Wh="manual",qh="hide",Uh="hidden",Yh="show",Gh="shown",Kh="inserted",Xh="click",Qh="focusin",Jh="focusout",Zh="mouseenter",ep="mouseleave",tp={AUTO:"auto",TOP:"top",RIGHT:Xe()?"left":"right",BOTTOM:"bottom",LEFT:Xe()?"right":"left"},np={allowList:Ia,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},ip={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"},ht=class n extends qe{constructor(e,t){if(typeof zi=="undefined")throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org/docs/v2/)");super(e,t),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return np}static get DefaultType(){return ip}static get NAME(){return Bh}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){if(this._isEnabled){if(this._isShown()){this._leave();return}this._enter()}}dispose(){clearTimeout(this._timeout),x.off(this._element.closest(ia),ra,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if(this._element.style.display==="none")throw new Error("Please use show on visible elements");if(!(this._isWithContent()&&this._isEnabled))return;let e=x.trigger(this._element,this.constructor.eventName(Yh)),i=(pa(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(e.defaultPrevented||!i)return;this._disposePopper();let r=this._getTipElement();this._element.setAttribute("aria-describedby",r.getAttribute("id"));let{container:o}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(o.append(r),x.trigger(this._element,this.constructor.eventName(Kh))),this._popper=this._createPopper(r),r.classList.add(Ui),"ontouchstart"in document.documentElement)for(let a of[].concat(...document.body.children))x.on(a,"mouseover",Qi);let s=()=>{x.trigger(this._element,this.constructor.eventName(Gh)),this._isHovered===!1&&this._leave(),this._isHovered=!1};this._queueCallback(s,this.tip,this._isAnimated())}hide(){if(!this._isShown()||x.trigger(this._element,this.constructor.eventName(qh)).defaultPrevented)return;if(this._getTipElement().classList.remove(Ui),"ontouchstart"in document.documentElement)for(let r of[].concat(...document.body.children))x.off(r,"mouseover",Qi);this._activeTrigger[_o]=!1,this._activeTrigger[bo]=!1,this._activeTrigger[ti]=!1,this._isHovered=null;let i=()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),x.trigger(this._element,this.constructor.eventName(Uh)))};this._queueCallback(i,this.tip,this._isAnimated())}update(){this._popper&&this._popper.update()}_isWithContent(){return!!this._getTitle()}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(e){let t=this._getTemplateFactory(e).toHtml();if(!t)return null;t.classList.remove(Eo,Ui),t.classList.add(`bs-${this.constructor.NAME}-auto`);let i=Wu(this.constructor.NAME).toString();return t.setAttribute("id",i),this._isAnimated()&&t.classList.add(Eo),t}setContent(e){this._newContent=e,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(e){return this._templateFactory?this._templateFactory.changeContent(e):this._templateFactory=new Lo(ae(O({},this._config),{content:e,extraClass:this._resolvePossibleFunction(this._config.customClass)})),this._templateFactory}_getContentForTemplate(){return{[jh]:this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(e){return this.constructor.getOrCreateInstance(e.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(Eo)}_isShown(){return this.tip&&this.tip.classList.contains(Ui)}_createPopper(e){let t=Pe(this._config.placement,[this,e,this._element]),i=tp[t.toUpperCase()];return Zn(this._element,e,this._getPopperConfig(i))}_getOffset(){let{offset:e}=this._config;return typeof e=="string"?e.split(",").map(t=>Number.parseInt(t,10)):typeof e=="function"?t=>e(t,this._element):e}_resolvePossibleFunction(e){return Pe(e,[this._element,this._element])}_getPopperConfig(e){let t={placement:e,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:i=>{this._getTipElement().setAttribute("data-popper-placement",i.state.placement)}}]};return O(O({},t),Pe(this._config.popperConfig,[void 0,t]))}_setListeners(){let e=this._config.trigger.split(" ");for(let t of e)if(t==="click")x.on(this._element,this.constructor.eventName(Xh),this._config.selector,i=>{let r=this._initializeOnDelegatedTarget(i);r._activeTrigger[_o]=!(r._isShown()&&r._activeTrigger[_o]),r.toggle()});else if(t!==Wh){let i=t===ti?this.constructor.eventName(Zh):this.constructor.eventName(Qh),r=t===ti?this.constructor.eventName(ep):this.constructor.eventName(Jh);x.on(this._element,i,this._config.selector,o=>{let s=this._initializeOnDelegatedTarget(o);s._activeTrigger[o.type==="focusin"?bo:ti]=!0,s._enter()}),x.on(this._element,r,this._config.selector,o=>{let s=this._initializeOnDelegatedTarget(o);s._activeTrigger[o.type==="focusout"?bo:ti]=s._element.contains(o.relatedTarget),s._leave()})}this._hideModalHandler=()=>{this._element&&this.hide()},x.on(this._element.closest(ia),ra,this._hideModalHandler)}_fixTitle(){let e=this._element.getAttribute("title");e&&(!this._element.getAttribute("aria-label")&&!this._element.textContent.trim()&&this._element.setAttribute("aria-label",e),this._element.setAttribute("data-bs-original-title",e),this._element.removeAttribute("title"))}_enter(){if(this._isShown()||this._isHovered){this._isHovered=!0;return}this._isHovered=!0,this._setTimeout(()=>{this._isHovered&&this.show()},this._config.delay.show)}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout(()=>{this._isHovered||this.hide()},this._config.delay.hide))}_setTimeout(e,t){clearTimeout(this._timeout),this._timeout=setTimeout(e,t)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(e){let t=ft.getDataAttributes(this._element);for(let i of Object.keys(t))Vh.has(i)&&delete t[i];return e=O(O({},t),typeof e=="object"&&e?e:{}),e=this._mergeConfigObj(e),e=this._configAfterMerge(e),this._typeCheckConfig(e),e}_configAfterMerge(e){return e.container=e.container===!1?document.body:xt(e.container),typeof e.delay=="number"&&(e.delay={show:e.delay,hide:e.delay}),typeof e.title=="number"&&(e.title=e.title.toString()),typeof e.content=="number"&&(e.content=e.content.toString()),e}_getDelegateConfig(){let e={};for(let[t,i]of Object.entries(this._config))this.constructor.Default[t]!==i&&(e[t]=i);return e.selector=!1,e.trigger="manual",e}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(e){return this.each(function(){let t=n.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof t[e]=="undefined")throw new TypeError(`No method named "${e}"`);t[e]()}})}};Je(ht);var rp="popover",op=".popover-header",sp=".popover-body",ap=ae(O({},ht.Default),{content:"",offset:[0,8],placement:"right",template:'',trigger:"click"}),lp=ae(O({},ht.DefaultType),{content:"(null|string|element|function)"}),An=class n extends ht{static get Default(){return ap}static get DefaultType(){return lp}static get NAME(){return rp}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{[op]:this._getTitle(),[sp]:this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(e){return this.each(function(){let t=n.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof t[e]=="undefined")throw new TypeError(`No method named "${e}"`);t[e]()}})}};Je(An);var cp="scrollspy",up="bs.scrollspy",Ho=`.${up}`,dp=".data-api",fp=`activate${Ho}`,oa=`click${Ho}`,hp=`load${Ho}${dp}`,pp="dropdown-item",wn="active",mp='[data-bs-spy="scroll"]',wo="[href]",gp=".nav, .list-group",sa=".nav-link",vp=".nav-item",yp=".list-group-item",Ep=`${sa}, ${vp} > ${sa}, ${yp}`,bp=".dropdown",_p=".dropdown-toggle",wp={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},xp={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"},rr=class n extends qe{constructor(e,t){super(e,t),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement=getComputedStyle(this._element).overflowY==="visible"?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return wp}static get DefaultType(){return xp}static get NAME(){return cp}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(let e of this._observableSections.values())this._observer.observe(e)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(e){return e.target=xt(e.target)||document.body,e.rootMargin=e.offset?`${e.offset}px 0px -30%`:e.rootMargin,typeof e.threshold=="string"&&(e.threshold=e.threshold.split(",").map(t=>Number.parseFloat(t))),e}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(x.off(this._config.target,oa),x.on(this._config.target,oa,wo,e=>{let t=this._observableSections.get(e.target.hash);if(t){e.preventDefault();let i=this._rootElement||window,r=t.offsetTop-this._element.offsetTop;if(i.scrollTo){i.scrollTo({top:r,behavior:"smooth"});return}i.scrollTop=r}}))}_getNewObserver(){let e={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver(t=>this._observerCallback(t),e)}_observerCallback(e){let t=s=>this._targetLinks.get(`#${s.target.id}`),i=s=>{this._previousScrollData.visibleEntryTop=s.target.offsetTop,this._process(t(s))},r=(this._rootElement||document.documentElement).scrollTop,o=r>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=r;for(let s of e){if(!s.isIntersecting){this._activeTarget=null,this._clearActiveClass(t(s));continue}let a=s.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(o&&a){if(i(s),!r)return;continue}!o&&!a&&i(s)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;let e=V.find(wo,this._config.target);for(let t of e){if(!t.hash||Tt(t))continue;let i=V.findOne(decodeURI(t.hash),this._element);Sn(i)&&(this._targetLinks.set(decodeURI(t.hash),t),this._observableSections.set(t.hash,i))}}_process(e){this._activeTarget!==e&&(this._clearActiveClass(this._config.target),this._activeTarget=e,e.classList.add(wn),this._activateParents(e),x.trigger(this._element,fp,{relatedTarget:e}))}_activateParents(e){if(e.classList.contains(pp)){V.findOne(_p,e.closest(bp)).classList.add(wn);return}for(let t of V.parents(e,gp))for(let i of V.prev(t,Ep))i.classList.add(wn)}_clearActiveClass(e){e.classList.remove(wn);let t=V.find(`${wo}.${wn}`,e);for(let i of t)i.classList.remove(wn)}static jQueryInterface(e){return this.each(function(){let t=n.getOrCreateInstance(this,e);if(typeof e=="string"){if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e]()}})}};x.on(window,hp,()=>{for(let n of V.find(mp))rr.getOrCreateInstance(n)});Je(rr);var Tp="tab",Cp="bs.tab",Zt=`.${Cp}`,Ap=`hide${Zt}`,Sp=`hidden${Zt}`,Dp=`show${Zt}`,Op=`shown${Zt}`,Lp=`click${Zt}`,Mp=`keydown${Zt}`,Np=`load${Zt}`,kp="ArrowLeft",aa="ArrowRight",Hp="ArrowUp",la="ArrowDown",xo="Home",ca="End",Kt="active",ua="fade",To="show",Rp="dropdown",Pa=".dropdown-toggle",Ip=".dropdown-menu",Co=`:not(${Pa})`,Pp='.list-group, .nav, [role="tablist"]',Fp=".nav-item, .list-group-item",$p=`.nav-link${Co}, .list-group-item${Co}, [role="tab"]${Co}`,Fa='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',Ao=`${$p}, ${Fa}`,Bp=`.${Kt}[data-bs-toggle="tab"], .${Kt}[data-bs-toggle="pill"], .${Kt}[data-bs-toggle="list"]`,Qt=class n extends qe{constructor(e){super(e),this._parent=this._element.closest(Pp),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),x.on(this._element,Mp,t=>this._keydown(t)))}static get NAME(){return Tp}show(){let e=this._element;if(this._elemIsActive(e))return;let t=this._getActiveElem(),i=t?x.trigger(t,Ap,{relatedTarget:e}):null;x.trigger(e,Dp,{relatedTarget:t}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(t,e),this._activate(e,t))}_activate(e,t){if(!e)return;e.classList.add(Kt),this._activate(V.getElementFromSelector(e));let i=()=>{if(e.getAttribute("role")!=="tab"){e.classList.add(To);return}e.removeAttribute("tabindex"),e.setAttribute("aria-selected",!0),this._toggleDropDown(e,!0),x.trigger(e,Op,{relatedTarget:t})};this._queueCallback(i,e,e.classList.contains(ua))}_deactivate(e,t){if(!e)return;e.classList.remove(Kt),e.blur(),this._deactivate(V.getElementFromSelector(e));let i=()=>{if(e.getAttribute("role")!=="tab"){e.classList.remove(To);return}e.setAttribute("aria-selected",!1),e.setAttribute("tabindex","-1"),this._toggleDropDown(e,!1),x.trigger(e,Sp,{relatedTarget:t})};this._queueCallback(i,e,e.classList.contains(ua))}_keydown(e){if(![kp,aa,Hp,la,xo,ca].includes(e.key))return;e.stopPropagation(),e.preventDefault();let t=this._getChildren().filter(r=>!Tt(r)),i;if([xo,ca].includes(e.key))i=t[e.key===xo?0:t.length-1];else{let r=[aa,la].includes(e.key);i=Mo(t,e.target,r,!0)}i&&(i.focus({preventScroll:!0}),n.getOrCreateInstance(i).show())}_getChildren(){return V.find(Ao,this._parent)}_getActiveElem(){return this._getChildren().find(e=>this._elemIsActive(e))||null}_setInitialAttributes(e,t){this._setAttributeIfNotExists(e,"role","tablist");for(let i of t)this._setInitialAttributesOnChild(i)}_setInitialAttributesOnChild(e){e=this._getInnerElement(e);let t=this._elemIsActive(e),i=this._getOuterElement(e);e.setAttribute("aria-selected",t),i!==e&&this._setAttributeIfNotExists(i,"role","presentation"),t||e.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(e,"role","tab"),this._setInitialAttributesOnTargetPanel(e)}_setInitialAttributesOnTargetPanel(e){let t=V.getElementFromSelector(e);t&&(this._setAttributeIfNotExists(t,"role","tabpanel"),e.id&&this._setAttributeIfNotExists(t,"aria-labelledby",`${e.id}`))}_toggleDropDown(e,t){let i=this._getOuterElement(e);if(!i.classList.contains(Rp))return;let r=(o,s)=>{let a=V.findOne(o,i);a&&a.classList.toggle(s,t)};r(Pa,Kt),r(Ip,To),i.setAttribute("aria-expanded",t)}_setAttributeIfNotExists(e,t,i){e.hasAttribute(t)||e.setAttribute(t,i)}_elemIsActive(e){return e.classList.contains(Kt)}_getInnerElement(e){return e.matches(Ao)?e:V.findOne(Ao,e)}_getOuterElement(e){return e.closest(Fp)||e}static jQueryInterface(e){return this.each(function(){let t=n.getOrCreateInstance(this);if(typeof e=="string"){if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e]()}})}};x.on(document,Lp,Fa,function(n){["A","AREA"].includes(this.tagName)&&n.preventDefault(),!Tt(this)&&Qt.getOrCreateInstance(this).show()});x.on(window,Np,()=>{for(let n of V.find(Bp))Qt.getOrCreateInstance(n)});Je(Qt);var Vp="toast",zp="bs.toast",Ot=`.${zp}`,jp=`mouseover${Ot}`,Wp=`mouseout${Ot}`,qp=`focusin${Ot}`,Up=`focusout${Ot}`,Yp=`hide${Ot}`,Gp=`hidden${Ot}`,Kp=`show${Ot}`,Xp=`shown${Ot}`,Qp="fade",da="hide",Yi="show",Gi="showing",Jp={animation:"boolean",autohide:"boolean",delay:"number"},Zp={animation:!0,autohide:!0,delay:5e3},pt=class n extends qe{constructor(e,t){super(e,t),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return Zp}static get DefaultType(){return Jp}static get NAME(){return Vp}show(){if(x.trigger(this._element,Kp).defaultPrevented)return;this._clearTimeout(),this._config.animation&&this._element.classList.add(Qp);let t=()=>{this._element.classList.remove(Gi),x.trigger(this._element,Xp),this._maybeScheduleHide()};this._element.classList.remove(da),ri(this._element),this._element.classList.add(Yi,Gi),this._queueCallback(t,this._element,this._config.animation)}hide(){if(!this.isShown()||x.trigger(this._element,Yp).defaultPrevented)return;let t=()=>{this._element.classList.add(da),this._element.classList.remove(Gi,Yi),x.trigger(this._element,Gp)};this._element.classList.add(Gi),this._queueCallback(t,this._element,this._config.animation)}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(Yi),super.dispose()}isShown(){return this._element.classList.contains(Yi)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout(()=>{this.hide()},this._config.delay)))}_onInteraction(e,t){switch(e.type){case"mouseover":case"mouseout":{this._hasMouseInteraction=t;break}case"focusin":case"focusout":{this._hasKeyboardInteraction=t;break}}if(t){this._clearTimeout();return}let i=e.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){x.on(this._element,jp,e=>this._onInteraction(e,!0)),x.on(this._element,Wp,e=>this._onInteraction(e,!1)),x.on(this._element,qp,e=>this._onInteraction(e,!0)),x.on(this._element,Up,e=>this._onInteraction(e,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(e){return this.each(function(){let t=n.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof t[e]=="undefined")throw new TypeError(`No method named "${e}"`);t[e](this)}})}};or(pt);Je(pt);var em=(function(){"use strict";let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(n,e){return getInputValues(n,e||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0,historyRestoreAsHxRequest:!0,reportValidityOfForms:!1},parseInterval:null,location,_:null,version:"2.0.8"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(n){return"[hx-"+n+"], [data-hx-"+n+"]"}).join(", ");function parseInterval(n){if(n==null)return;let e=NaN;return n.slice(-2)=="ms"?e=parseFloat(n.slice(0,-2)):n.slice(-1)=="s"?e=parseFloat(n.slice(0,-1))*1e3:n.slice(-1)=="m"?e=parseFloat(n.slice(0,-1))*1e3*60:e=parseFloat(n),isNaN(e)?void 0:e}function getRawAttribute(n,e){return n instanceof Element&&n.getAttribute(e)}function hasAttribute(n,e){return!!n.hasAttribute&&(n.hasAttribute(e)||n.hasAttribute("data-"+e))}function getAttributeValue(n,e){return getRawAttribute(n,e)||getRawAttribute(n,"data-"+e)}function parentElt(n){let e=n.parentElement;return!e&&n.parentNode instanceof ShadowRoot?n.parentNode:e}function getDocument(){return document}function getRootNode(n,e){return n.getRootNode?n.getRootNode({composed:e}):getDocument()}function getClosestMatch(n,e){for(;n&&!e(n);)n=parentElt(n);return n||null}function getAttributeValueWithDisinheritance(n,e,t){let i=getAttributeValue(e,t),r=getAttributeValue(e,"hx-disinherit");var o=getAttributeValue(e,"hx-inherit");if(n!==e){if(htmx.config.disableInheritance)return o&&(o==="*"||o.split(" ").indexOf(t)>=0)?i:null;if(r&&(r==="*"||r.split(" ").indexOf(t)>=0))return"unset"}return i}function getClosestAttributeValue(n,e){let t=null;if(getClosestMatch(n,function(i){return!!(t=getAttributeValueWithDisinheritance(n,asElement(i),e))}),t!=="unset")return t}function matches(n,e){return n instanceof Element&&n.matches(e)}function getStartTag(n){let t=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(n);return t?t[1].toLowerCase():""}function parseHTML(n){return"parseHTMLUnsafe"in Document?Document.parseHTMLUnsafe(n):new DOMParser().parseFromString(n,"text/html")}function takeChildrenFor(n,e){for(;e.childNodes.length>0;)n.append(e.childNodes[0])}function duplicateScript(n){let e=getDocument().createElement("script");return forEach(n.attributes,function(t){e.setAttribute(t.name,t.value)}),e.textContent=n.textContent,e.async=!1,htmx.config.inlineScriptNonce&&(e.nonce=htmx.config.inlineScriptNonce),e}function isJavaScriptScriptNode(n){return n.matches("script")&&(n.type==="text/javascript"||n.type==="module"||n.type==="")}function normalizeScriptTags(n){Array.from(n.querySelectorAll("script")).forEach(e=>{if(isJavaScriptScriptNode(e)){let t=duplicateScript(e),i=e.parentNode;try{i.insertBefore(t,e)}catch(r){logError(r)}finally{e.remove()}}})}function makeFragment(n){let e=n.replace(/]*)?>[\s\S]*?<\/head>/i,""),t=getStartTag(e),i;if(t==="html"){i=new DocumentFragment;let o=parseHTML(n);takeChildrenFor(i,o.body),i.title=o.title}else if(t==="body"){i=new DocumentFragment;let o=parseHTML(e);takeChildrenFor(i,o.body),i.title=o.title}else{let o=parseHTML('");i=o.querySelector("template").content,i.title=o.title;var r=i.querySelector("title");r&&r.parentNode===i&&(r.remove(),i.title=r.innerText)}return i&&(htmx.config.allowScriptTags?normalizeScriptTags(i):i.querySelectorAll("script").forEach(o=>o.remove())),i}function maybeCall(n){n&&n()}function isType(n,e){return Object.prototype.toString.call(n)==="[object "+e+"]"}function isFunction(n){return typeof n=="function"}function isRawObject(n){return isType(n,"Object")}function getInternalData(n){let e="htmx-internal-data",t=n[e];return t||(t=n[e]={}),t}function toArray(n){let e=[];if(n)for(let t=0;t=0}function bodyContains(n){return n.getRootNode({composed:!0})===document}function splitOnWhitespace(n){return n.trim().split(/\s+/)}function mergeObjects(n,e){for(let t in e)e.hasOwnProperty(t)&&(n[t]=e[t]);return n}function parseJSON(n){try{return JSON.parse(n)}catch(e){return logError(e),null}}function canAccessLocalStorage(){let n="htmx:sessionStorageTest";try{return sessionStorage.setItem(n,n),sessionStorage.removeItem(n),!0}catch(e){return!1}}function normalizePath(n){let e=new URL(n,"http://x");return e&&(n=e.pathname+e.search),n!="/"&&(n=n.replace(/\/+$/,"")),n}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(n){return htmx.on("htmx:load",function(t){n(t.detail.elt)})}function logAll(){htmx.logger=function(n,e,t){console&&console.log(e,n,t)}}function logNone(){htmx.logger=null}function find(n,e){return typeof n!="string"?n.querySelector(e):find(getDocument(),n)}function findAll(n,e){return typeof n!="string"?n.querySelectorAll(e):findAll(getDocument(),n)}function getWindow(){return window}function removeElement(n,e){n=resolveTarget(n),e?getWindow().setTimeout(function(){removeElement(n),n=null},e):parentElt(n).removeChild(n)}function asElement(n){return n instanceof Element?n:null}function asHtmlElement(n){return n instanceof HTMLElement?n:null}function asString(n){return typeof n=="string"?n:null}function asParentNode(n){return n instanceof Element||n instanceof Document||n instanceof DocumentFragment?n:null}function addClassToElement(n,e,t){n=asElement(resolveTarget(n)),n&&(t?getWindow().setTimeout(function(){addClassToElement(n,e),n=null},t):n.classList&&n.classList.add(e))}function removeClassFromElement(n,e,t){let i=asElement(resolveTarget(n));i&&(t?getWindow().setTimeout(function(){removeClassFromElement(i,e),i=null},t):i.classList&&(i.classList.remove(e),i.classList.length===0&&i.removeAttribute("class")))}function toggleClassOnElement(n,e){n=resolveTarget(n),n.classList.toggle(e)}function takeClassForElement(n,e){n=resolveTarget(n),forEach(n.parentElement.children,function(t){removeClassFromElement(t,e)}),addClassToElement(asElement(n),e)}function closest(n,e){return n=asElement(resolveTarget(n)),n?n.closest(e):null}function startsWith(n,e){return n.substring(0,e.length)===e}function endsWith(n,e){return n.substring(n.length-e.length)===e}function normalizeSelector(n){let e=n.trim();return startsWith(e,"<")&&endsWith(e,"/>")?e.substring(1,e.length-2):e}function querySelectorAllExt(n,e,t){if(e.indexOf("global ")===0)return querySelectorAllExt(n,e.slice(7),!0);n=resolveTarget(n);let i=[];{let s=0,a=0;for(let l=0;l"&&s--}a0;){let s=normalizeSelector(i.shift()),a;s.indexOf("closest ")===0?a=closest(asElement(n),normalizeSelector(s.slice(8))):s.indexOf("find ")===0?a=find(asParentNode(n),normalizeSelector(s.slice(5))):s==="next"||s==="nextElementSibling"?a=asElement(n).nextElementSibling:s.indexOf("next ")===0?a=scanForwardQuery(n,normalizeSelector(s.slice(5)),!!t):s==="previous"||s==="previousElementSibling"?a=asElement(n).previousElementSibling:s.indexOf("previous ")===0?a=scanBackwardsQuery(n,normalizeSelector(s.slice(9)),!!t):s==="document"?a=document:s==="window"?a=window:s==="body"?a=document.body:s==="root"?a=getRootNode(n,!!t):s==="host"?a=n.getRootNode().host:o.push(s),a&&r.push(a)}if(o.length>0){let s=o.join(","),a=asParentNode(getRootNode(n,!!t));r.push(...toArray(a.querySelectorAll(s)))}return r}var scanForwardQuery=function(n,e,t){let i=asParentNode(getRootNode(n,t)).querySelectorAll(e);for(let r=0;r=0;r--){let o=i[r];if(o.compareDocumentPosition(n)===Node.DOCUMENT_POSITION_FOLLOWING)return o}};function querySelectorExt(n,e){return typeof n!="string"?querySelectorAllExt(n,e)[0]:querySelectorAllExt(getDocument().body,n)[0]}function resolveTarget(n,e){return typeof n=="string"?find(asParentNode(e)||document,n):n}function processEventArgs(n,e,t,i){return isFunction(e)?{target:getDocument().body,event:asString(n),listener:e,options:t}:{target:resolveTarget(n),event:asString(e),listener:t,options:i}}function addEventListenerImpl(n,e,t,i){return ready(function(){let o=processEventArgs(n,e,t,i);o.target.addEventListener(o.event,o.listener,o.options)}),isFunction(e)?e:t}function removeEventListenerImpl(n,e,t){return ready(function(){let i=processEventArgs(n,e,t);i.target.removeEventListener(i.event,i.listener)}),isFunction(e)?e:t}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(n,e){let t=getClosestAttributeValue(n,e);if(t){if(t==="this")return[findThisElement(n,e)];{let i=querySelectorAllExt(n,t);if(/(^|,)(\s*)inherit(\s*)($|,)/.test(t)){let o=asElement(getClosestMatch(n,function(s){return s!==n&&hasAttribute(asElement(s),e)}));o&&i.push(...findAttributeTargets(o,e))}return i.length===0?(logError('The selector "'+t+'" on '+e+" returned no matches!"),[DUMMY_ELT]):i}}}function findThisElement(n,e){return asElement(getClosestMatch(n,function(t){return getAttributeValue(asElement(t),e)!=null}))}function getTarget(n){let e=getClosestAttributeValue(n,"hx-target");return e?e==="this"?findThisElement(n,"hx-target"):querySelectorExt(n,e):getInternalData(n).boosted?getDocument().body:n}function shouldSettleAttribute(n){return htmx.config.attributesToSettle.includes(n)}function cloneAttributes(n,e){forEach(Array.from(n.attributes),function(t){!e.hasAttribute(t.name)&&shouldSettleAttribute(t.name)&&n.removeAttribute(t.name)}),forEach(e.attributes,function(t){shouldSettleAttribute(t.name)&&n.setAttribute(t.name,t.value)})}function isInlineSwap(n,e){let t=getExtensions(e);for(let i=0;i0?(o=n.substring(0,n.indexOf(":")),r=n.substring(n.indexOf(":")+1)):o=n),e.removeAttribute("hx-swap-oob"),e.removeAttribute("data-hx-swap-oob");let s=querySelectorAllExt(i,r,!1);return s.length?(forEach(s,function(a){let l,c=e.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(c),isInlineSwap(o,a)||(l=asParentNode(c));let u={shouldSwap:!0,target:a,fragment:l};triggerEvent(a,"htmx:oobBeforeSwap",u)&&(a=u.target,u.shouldSwap&&(handlePreservedElements(l),swapWithStyle(o,a,a,l,t),restorePreservedElements()),forEach(t.elts,function(d){triggerEvent(d,"htmx:oobAfterSwap",u)}))}),e.parentNode.removeChild(e)):(e.parentNode.removeChild(e),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:e})),n}function restorePreservedElements(){let n=find("#--htmx-preserve-pantry--");if(n){for(let e of[...n.children]){let t=find("#"+e.id);t.parentNode.moveBefore(e,t),t.remove()}n.remove()}}function handlePreservedElements(n){forEach(findAll(n,"[hx-preserve], [data-hx-preserve]"),function(e){let t=getAttributeValue(e,"id"),i=getDocument().getElementById(t);if(i!=null)if(e.moveBefore){let r=find("#--htmx-preserve-pantry--");r==null&&(getDocument().body.insertAdjacentHTML("afterend","
    "),r=find("#--htmx-preserve-pantry--")),r.moveBefore(i,null)}else e.parentNode.replaceChild(i,e)})}function handleAttributes(n,e,t){forEach(e.querySelectorAll("[id]"),function(i){let r=getRawAttribute(i,"id");if(r&&r.length>0){let o=r.replace("'","\\'"),s=i.tagName.replace(":","\\:"),a=asParentNode(n),l=a&&a.querySelector(s+"[id='"+o+"']");if(l&&l!==a){let c=i.cloneNode();cloneAttributes(i,l),t.tasks.push(function(){cloneAttributes(i,c)})}}})}function makeAjaxLoadTask(n){return function(){removeClassFromElement(n,htmx.config.addedClass),processNode(asElement(n)),processFocus(asParentNode(n)),triggerEvent(n,"htmx:load")}}function processFocus(n){let e="[autofocus]",t=asHtmlElement(matches(n,e)?n:n.querySelector(e));t!=null&&t.focus()}function insertNodesBefore(n,e,t,i){for(handleAttributes(n,t,i);t.childNodes.length>0;){let r=t.firstChild;addClassToElement(asElement(r),htmx.config.addedClass),n.insertBefore(r,e),r.nodeType!==Node.TEXT_NODE&&r.nodeType!==Node.COMMENT_NODE&&i.tasks.push(makeAjaxLoadTask(r))}}function stringHash(n,e){let t=0;for(;t0}function swap(n,e,t,i){i||(i={});let r=null,o=null,s=function(){maybeCall(i.beforeSwapCallback),n=resolveTarget(n);let c=i.contextElement?getRootNode(i.contextElement,!1):getDocument(),u=document.activeElement,d={};d={elt:u,start:u?u.selectionStart:null,end:u?u.selectionEnd:null};let p=makeSettleInfo(n);if(t.swapStyle==="textContent")n.textContent=e;else{let m=makeFragment(e);if(p.title=i.title||m.title,i.historyRequest&&(m=m.querySelector("[hx-history-elt],[data-hx-history-elt]")||m),i.selectOOB){let v=i.selectOOB.split(",");for(let _=0;_0?getWindow().setTimeout(y,t.settleDelay):y()},a=htmx.config.globalViewTransitions;t.hasOwnProperty("transition")&&(a=t.transition);let l=i.contextElement||getDocument();if(a&&triggerEvent(l,"htmx:beforeTransition",i.eventInfo)&&typeof Promise!="undefined"&&document.startViewTransition){let c=new Promise(function(d,p){r=d,o=p}),u=s;s=function(){document.startViewTransition(function(){return u(),c})}}try{t!=null&&t.swapDelay&&t.swapDelay>0?getWindow().setTimeout(s,t.swapDelay):s()}catch(c){throw triggerErrorEvent(l,"htmx:swapError",i.eventInfo),maybeCall(o),c}}function handleTriggerHeader(n,e,t){let i=n.getResponseHeader(e);if(i.indexOf("{")===0){let r=parseJSON(i);for(let o in r)if(r.hasOwnProperty(o)){let s=r[o];isRawObject(s)?t=s.target!==void 0?s.target:t:s={value:s},triggerEvent(t,o,s)}}else{let r=i.split(",");for(let o=0;o0;){let s=e[0];if(s==="]"){if(i--,i===0){o===null&&(r=r+"true"),e.shift(),r+=")})";try{let a=maybeEval(n,function(){return Function(r)()},function(){return!0});return a.source=r,a}catch(a){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:a,source:r}),null}}}else s==="["&&i++;isPossibleRelativeReference(s,o,t)?r+="(("+t+"."+s+") ? ("+t+"."+s+") : (window."+s+"))":r=r+s,o=e.shift()}}}function consumeUntil(n,e){let t="";for(;n.length>0&&!e.test(n[0]);)t+=n.shift();return t}function consumeCSSSelector(n){let e;return n.length>0&&COMBINED_SELECTOR_START.test(n[0])?(n.shift(),e=consumeUntil(n,COMBINED_SELECTOR_END).trim(),n.shift()):e=consumeUntil(n,WHITESPACE_OR_COMMA),e}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(n,e,t){let i=[],r=tokenizeString(e);do{consumeUntil(r,NOT_WHITESPACE);let a=r.length,l=consumeUntil(r,/[,\[\s]/);if(l!=="")if(l==="every"){let c={trigger:"every"};consumeUntil(r,NOT_WHITESPACE),c.pollInterval=parseInterval(consumeUntil(r,/[,\[\s]/)),consumeUntil(r,NOT_WHITESPACE);var o=maybeGenerateConditional(n,r,"event");o&&(c.eventFilter=o),i.push(c)}else{let c={trigger:l};var o=maybeGenerateConditional(n,r,"event");for(o&&(c.eventFilter=o),consumeUntil(r,NOT_WHITESPACE);r.length>0&&r[0]!==",";){let d=r.shift();if(d==="changed")c.changed=!0;else if(d==="once")c.once=!0;else if(d==="consume")c.consume=!0;else if(d==="delay"&&r[0]===":")r.shift(),c.delay=parseInterval(consumeUntil(r,WHITESPACE_OR_COMMA));else if(d==="from"&&r[0]===":"){if(r.shift(),COMBINED_SELECTOR_START.test(r[0]))var s=consumeCSSSelector(r);else{var s=consumeUntil(r,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){r.shift();let y=consumeCSSSelector(r);y.length>0&&(s+=" "+y)}}c.from=s}else d==="target"&&r[0]===":"?(r.shift(),c.target=consumeCSSSelector(r)):d==="throttle"&&r[0]===":"?(r.shift(),c.throttle=parseInterval(consumeUntil(r,WHITESPACE_OR_COMMA))):d==="queue"&&r[0]===":"?(r.shift(),c.queue=consumeUntil(r,WHITESPACE_OR_COMMA)):d==="root"&&r[0]===":"?(r.shift(),c[d]=consumeCSSSelector(r)):d==="threshold"&&r[0]===":"?(r.shift(),c[d]=consumeUntil(r,WHITESPACE_OR_COMMA)):triggerErrorEvent(n,"htmx:syntax:error",{token:r.shift()});consumeUntil(r,NOT_WHITESPACE)}i.push(c)}r.length===a&&triggerErrorEvent(n,"htmx:syntax:error",{token:r.shift()}),consumeUntil(r,NOT_WHITESPACE)}while(r[0]===","&&r.shift());return t&&(t[e]=i),i}function getTriggerSpecs(n){let e=getAttributeValue(n,"hx-trigger"),t=[];if(e){let i=htmx.config.triggerSpecsCache;t=i&&i[e]||parseAndCacheTrigger(n,e,i)}return t.length>0?t:matches(n,"form")?[{trigger:"submit"}]:matches(n,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(n,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(n){getInternalData(n).cancelled=!0}function processPolling(n,e,t){let i=getInternalData(n);i.timeout=getWindow().setTimeout(function(){bodyContains(n)&&i.cancelled!==!0&&(maybeFilterEvent(t,n,makeEvent("hx:poll:trigger",{triggerSpec:t,target:n}))||e(n),processPolling(n,e,t))},t.pollInterval)}function isLocalLink(n){return location.hostname===n.hostname&&getRawAttribute(n,"href")&&getRawAttribute(n,"href").indexOf("#")!==0}function eltIsDisabled(n){return closest(n,htmx.config.disableSelector)}function boostElement(n,e,t){if(n instanceof HTMLAnchorElement&&isLocalLink(n)&&(n.target===""||n.target==="_self")||n.tagName==="FORM"&&String(getRawAttribute(n,"method")).toLowerCase()!=="dialog"){e.boosted=!0;let i,r;if(n.tagName==="A")i="get",r=getRawAttribute(n,"href");else{let o=getRawAttribute(n,"method");i=o?o.toLowerCase():"get",r=getRawAttribute(n,"action"),(r==null||r==="")&&(r=location.href),i==="get"&&r.includes("?")&&(r=r.replace(/\?[^#]+/,""))}t.forEach(function(o){addEventListener(n,function(s,a){let l=asElement(s);if(eltIsDisabled(l)){cleanUpElement(l);return}issueAjaxRequest(i,r,l,a)},e,o,!0)})}}function shouldCancel(n,e){if(n.type==="submit"&&e.tagName==="FORM")return!0;if(n.type==="click"){let t=e.closest('input[type="submit"], button');if(t&&t.form&&t.type==="submit")return!0;let i=e.closest("a"),r=/^#.+/;if(i&&i.href&&!r.test(i.getAttribute("href")))return!0}return!1}function ignoreBoostedAnchorCtrlClick(n,e){return getInternalData(n).boosted&&n instanceof HTMLAnchorElement&&e.type==="click"&&(e.ctrlKey||e.metaKey)}function maybeFilterEvent(n,e,t){let i=n.eventFilter;if(i)try{return i.call(e,t)!==!0}catch(r){let o=i.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:r,source:o}),!0}return!1}function addEventListener(n,e,t,i,r){let o=getInternalData(n),s;i.from?s=querySelectorAllExt(n,i.from):s=[n],i.changed&&("lastValue"in o||(o.lastValue=new WeakMap),s.forEach(function(a){o.lastValue.has(i)||o.lastValue.set(i,new WeakMap),o.lastValue.get(i).set(a,a.value)})),forEach(s,function(a){let l=function(c){if(!bodyContains(n)){a.removeEventListener(i.trigger,l);return}if(ignoreBoostedAnchorCtrlClick(n,c)||((r||shouldCancel(c,a))&&c.preventDefault(),maybeFilterEvent(i,n,c)))return;let u=getInternalData(c);if(u.triggerSpec=i,u.handledFor==null&&(u.handledFor=[]),u.handledFor.indexOf(n)<0){if(u.handledFor.push(n),i.consume&&c.stopPropagation(),i.target&&c.target&&!matches(asElement(c.target),i.target))return;if(i.once){if(o.triggeredOnce)return;o.triggeredOnce=!0}if(i.changed){let d=c.target,p=d.value,y=o.lastValue.get(i);if(y.has(d)&&y.get(d)===p)return;y.set(d,p)}if(o.delayed&&clearTimeout(o.delayed),o.throttle)return;i.throttle>0?o.throttle||(triggerEvent(n,"htmx:trigger"),e(n,c),o.throttle=getWindow().setTimeout(function(){o.throttle=null},i.throttle)):i.delay>0?o.delayed=getWindow().setTimeout(function(){triggerEvent(n,"htmx:trigger"),e(n,c)},i.delay):(triggerEvent(n,"htmx:trigger"),e(n,c))}};t.listenerInfos==null&&(t.listenerInfos=[]),t.listenerInfos.push({trigger:i.trigger,listener:l,on:a}),a.addEventListener(i.trigger,l)})}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0},window.addEventListener("scroll",scrollHandler),window.addEventListener("resize",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(n){maybeReveal(n)}))},200))}function maybeReveal(n){!hasAttribute(n,"data-hx-revealed")&&isScrolledIntoView(n)&&(n.setAttribute("data-hx-revealed","true"),getInternalData(n).initHash?triggerEvent(n,"revealed"):n.addEventListener("htmx:afterProcessNode",function(){triggerEvent(n,"revealed")},{once:!0}))}function loadImmediately(n,e,t,i){let r=function(){t.loaded||(t.loaded=!0,triggerEvent(n,"htmx:trigger"),e(n))};i>0?getWindow().setTimeout(r,i):r()}function processVerbs(n,e,t){let i=!1;return forEach(VERBS,function(r){if(hasAttribute(n,"hx-"+r)){let o=getAttributeValue(n,"hx-"+r);i=!0,e.path=o,e.verb=r,t.forEach(function(s){addTriggerHandler(n,s,e,function(a,l){let c=asElement(a);if(eltIsDisabled(c)){cleanUpElement(c);return}issueAjaxRequest(r,o,c,l)})})}}),i}function addTriggerHandler(n,e,t,i){if(e.trigger==="revealed")initScrollHandler(),addEventListener(n,i,t,e),maybeReveal(asElement(n));else if(e.trigger==="intersect"){let r={};e.root&&(r.root=querySelectorExt(n,e.root)),e.threshold&&(r.threshold=parseFloat(e.threshold)),new IntersectionObserver(function(s){for(let a=0;a0?(t.polling=!0,processPolling(asElement(n),i,e)):addEventListener(n,i,t,e)}function shouldProcessHxOn(n){let e=asElement(n);if(!e)return!1;let t=e.attributes;for(let i=0;i", "+o).join(""))}else return[]}function maybeSetLastButtonClicked(n){let e=getTargetButton(n.target),t=getRelatedFormData(n);t&&(t.lastButtonClicked=e)}function maybeUnsetLastButtonClicked(n){let e=getRelatedFormData(n);e&&(e.lastButtonClicked=null)}function getTargetButton(n){return closest(asElement(n),"button, input[type='submit']")}function getRelatedForm(n){return n.form||closest(n,"form")}function getRelatedFormData(n){let e=getTargetButton(n.target);if(!e)return;let t=getRelatedForm(e);if(t)return getInternalData(t)}function initButtonTracking(n){n.addEventListener("click",maybeSetLastButtonClicked),n.addEventListener("focusin",maybeSetLastButtonClicked),n.addEventListener("focusout",maybeUnsetLastButtonClicked)}function addHxOnEventHandler(n,e,t){let i=getInternalData(n);Array.isArray(i.onHandlers)||(i.onHandlers=[]);let r,o=function(s){maybeEval(n,function(){eltIsDisabled(n)||(r||(r=new Function("event",t)),r.call(n,s))})};n.addEventListener(e,o),i.onHandlers.push({event:e,listener:o})}function processHxOnWildcard(n){deInitOnHandlers(n);for(let e=0;ehtmx.config.historyCacheSize;)o.shift();for(;o.length>0;)try{sessionStorage.setItem("htmx-history-cache",JSON.stringify(o));break}catch(a){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:a,cache:o}),o.shift()}}function getCachedHistory(n){if(!canAccessLocalStorage())return null;n=normalizePath(n);let e=parseJSON(sessionStorage.getItem("htmx-history-cache"))||[];for(let t=0;t=200&&this.status<400?(i.response=this.response,triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",i),swap(i.historyElt,i.response,t,{contextElement:i.historyElt,historyRequest:!0}),setCurrentPathForHistory(i.path),triggerEvent(getDocument().body,"htmx:historyRestore",{path:n,cacheMiss:!0,serverResponse:i.response})):triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",i)},triggerEvent(getDocument().body,"htmx:historyCacheMiss",i)&&e.send()}function restoreHistory(n){saveCurrentPageToHistory(),n=n||location.pathname+location.search;let e=getCachedHistory(n);if(e){let t={swapStyle:"innerHTML",swapDelay:0,settleDelay:0,scroll:e.scroll},i={path:n,item:e,historyElt:getHistoryElement(),swapSpec:t};triggerEvent(getDocument().body,"htmx:historyCacheHit",i)&&(swap(i.historyElt,e.content,t,{contextElement:i.historyElt,title:e.title}),setCurrentPathForHistory(i.path),triggerEvent(getDocument().body,"htmx:historyRestore",i))}else htmx.config.refreshOnHistoryMiss?htmx.location.reload(!0):loadHistoryFromServer(n)}function addRequestIndicatorClasses(n){let e=findAttributeTargets(n,"hx-indicator");return e==null&&(e=[n]),forEach(e,function(t){let i=getInternalData(t);i.requestCount=(i.requestCount||0)+1,t.classList.add.call(t.classList,htmx.config.requestClass)}),e}function disableElements(n){let e=findAttributeTargets(n,"hx-disabled-elt");return e==null&&(e=[]),forEach(e,function(t){let i=getInternalData(t);i.requestCount=(i.requestCount||0)+1,t.setAttribute("disabled",""),t.setAttribute("data-disabled-by-htmx","")}),e}function removeRequestIndicators(n,e){forEach(n.concat(e),function(t){let i=getInternalData(t);i.requestCount=(i.requestCount||1)-1}),forEach(n,function(t){getInternalData(t).requestCount===0&&t.classList.remove.call(t.classList,htmx.config.requestClass)}),forEach(e,function(t){getInternalData(t).requestCount===0&&(t.removeAttribute("disabled"),t.removeAttribute("data-disabled-by-htmx"))})}function haveSeenNode(n,e){for(let t=0;te.indexOf(r)<0):i=i.filter(r=>r!==e),t.delete(n),forEach(i,r=>t.append(n,r))}}function getValueFromInput(n){return n instanceof HTMLSelectElement&&n.multiple?toArray(n.querySelectorAll("option:checked")).map(function(e){return e.value}):n instanceof HTMLInputElement&&n.files?toArray(n.files):n.value}function processInputValue(n,e,t,i,r){if(!(i==null||haveSeenNode(n,i))){if(n.push(i),shouldInclude(i)){let o=getRawAttribute(i,"name");addValueToFormData(o,getValueFromInput(i),e),r&&validateElement(i,t)}i instanceof HTMLFormElement&&(forEach(i.elements,function(o){n.indexOf(o)>=0?removeValueFromFormData(o.name,getValueFromInput(o),e):n.push(o),r&&validateElement(o,t)}),new FormData(i).forEach(function(o,s){o instanceof File&&o.name===""||addValueToFormData(s,o,e)}))}}function validateElement(n,e){let t=n;t.willValidate&&(triggerEvent(t,"htmx:validation:validate"),t.checkValidity()||(triggerEvent(t,"htmx:validation:failed",{message:t.validationMessage,validity:t.validity})&&!e.length&&htmx.config.reportValidityOfForms&&t.reportValidity(),e.push({elt:t,message:t.validationMessage,validity:t.validity})))}function overrideFormData(n,e){for(let t of e.keys())n.delete(t);return e.forEach(function(t,i){n.append(i,t)}),n}function getInputValues(n,e){let t=[],i=new FormData,r=new FormData,o=[],s=getInternalData(n);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let a=n instanceof HTMLFormElement&&n.noValidate!==!0||getAttributeValue(n,"hx-validate")==="true";if(s.lastButtonClicked&&(a=a&&s.lastButtonClicked.formNoValidate!==!0),e!=="get"&&processInputValue(t,r,o,getRelatedForm(n),a),processInputValue(t,i,o,n,a),s.lastButtonClicked||n.tagName==="BUTTON"||n.tagName==="INPUT"&&getRawAttribute(n,"type")==="submit"){let c=s.lastButtonClicked||n,u=getRawAttribute(c,"name");addValueToFormData(u,c.value,r)}let l=findAttributeTargets(n,"hx-include");return forEach(l,function(c){processInputValue(t,i,o,asElement(c),a),matches(c,"form")||forEach(asParentNode(c).querySelectorAll(INPUT_SELECTOR),function(u){processInputValue(t,i,o,u,a)})}),overrideFormData(i,r),{errors:o,formData:i,values:formDataProxy(i)}}function appendParam(n,e,t){n!==""&&(n+="&"),String(t)==="[object Object]"&&(t=JSON.stringify(t));let i=encodeURIComponent(t);return n+=encodeURIComponent(e)+"="+i,n}function urlEncode(n){n=formDataFromObject(n);let e="";return n.forEach(function(t,i){e=appendParam(e,i,t)}),e}function getHeaders(n,e,t){let i={"HX-Request":"true","HX-Trigger":getRawAttribute(n,"id"),"HX-Trigger-Name":getRawAttribute(n,"name"),"HX-Target":getAttributeValue(e,"id"),"HX-Current-URL":location.href};return getValuesForElement(n,"hx-headers",!1,i),t!==void 0&&(i["HX-Prompt"]=t),getInternalData(n).boosted&&(i["HX-Boosted"]="true"),i}function filterValues(n,e){let t=getClosestAttributeValue(e,"hx-params");if(t){if(t==="none")return new FormData;if(t==="*")return n;if(t.indexOf("not ")===0)return forEach(t.slice(4).split(","),function(i){i=i.trim(),n.delete(i)}),n;{let i=new FormData;return forEach(t.split(","),function(r){r=r.trim(),n.has(r)&&n.getAll(r).forEach(function(o){i.append(r,o)})}),i}}else return n}function isAnchorLink(n){return!!getRawAttribute(n,"href")&&getRawAttribute(n,"href").indexOf("#")>=0}function getSwapSpecification(n,e){let t=e||getClosestAttributeValue(n,"hx-swap"),i={swapStyle:getInternalData(n).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(n).boosted&&!isAnchorLink(n)&&(i.show="top"),t){let s=splitOnWhitespace(t);if(s.length>0)for(let a=0;a0?r.join(":"):null;i.scroll=u,i.scrollTarget=o}else if(l.indexOf("show:")===0){var r=l.slice(5).split(":");let d=r.pop();var o=r.length>0?r.join(":"):null;i.show=d,i.showTarget=o}else if(l.indexOf("focus-scroll:")===0){let c=l.slice(13);i.focusScroll=c=="true"}else a==0?i.swapStyle=l:logError("Unknown modifier in hx-swap: "+l)}}return i}function usesFormData(n){return getClosestAttributeValue(n,"hx-encoding")==="multipart/form-data"||matches(n,"form")&&getRawAttribute(n,"enctype")==="multipart/form-data"}function encodeParamsForBody(n,e,t){let i=null;return withExtensions(e,function(r){i==null&&(i=r.encodeParameters(n,t,e))}),i!=null?i:usesFormData(e)?overrideFormData(new FormData,formDataFromObject(t)):urlEncode(t)}function makeSettleInfo(n){return{tasks:[],elts:[n]}}function updateScrollState(n,e){let t=n[0],i=n[n.length-1];if(e.scroll){var r=null;e.scrollTarget&&(r=asElement(querySelectorExt(t,e.scrollTarget))),e.scroll==="top"&&(t||r)&&(r=r||t,r.scrollTop=0),e.scroll==="bottom"&&(i||r)&&(r=r||i,r.scrollTop=r.scrollHeight),typeof e.scroll=="number"&&getWindow().setTimeout(function(){window.scrollTo(0,e.scroll)},0)}if(e.show){var r=null;if(e.showTarget){let s=e.showTarget;e.showTarget==="window"&&(s="body"),r=asElement(querySelectorExt(t,s))}e.show==="top"&&(t||r)&&(r=r||t,r.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),e.show==="bottom"&&(i||r)&&(r=r||i,r.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}))}}function getValuesForElement(n,e,t,i,r){if(i==null&&(i={}),n==null)return i;let o=getAttributeValue(n,e);if(o){let s=o.trim(),a=t;if(s==="unset")return null;s.indexOf("javascript:")===0?(s=s.slice(11),a=!0):s.indexOf("js:")===0&&(s=s.slice(3),a=!0),s.indexOf("{")!==0&&(s="{"+s+"}");let l;a?l=maybeEval(n,function(){return r?Function("event","return ("+s+")").call(n,r):Function("return ("+s+")").call(n)},{}):l=parseJSON(s);for(let c in l)l.hasOwnProperty(c)&&i[c]==null&&(i[c]=l[c])}return getValuesForElement(asElement(parentElt(n)),e,t,i,r)}function maybeEval(n,e,t){return htmx.config.allowEval?e():(triggerErrorEvent(n,"htmx:evalDisallowedError"),t)}function getHXVarsForElement(n,e,t){return getValuesForElement(n,"hx-vars",!0,t,e)}function getHXValsForElement(n,e,t){return getValuesForElement(n,"hx-vals",!1,t,e)}function getExpressionVars(n,e){return mergeObjects(getHXVarsForElement(n,e),getHXValsForElement(n,e))}function safelySetHeaderValue(n,e,t){if(t!==null)try{n.setRequestHeader(e,t)}catch(i){n.setRequestHeader(e,encodeURIComponent(t)),n.setRequestHeader(e+"-URI-AutoEncoded","true")}}function getPathFromResponse(n){if(n.responseURL)try{let e=new URL(n.responseURL);return e.pathname+e.search}catch(e){triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:n.responseURL})}}function hasHeader(n,e){return e.test(n.getAllResponseHeaders())}function ajaxHelper(n,e,t){if(n=n.toLowerCase(),t){if(t instanceof Element||typeof t=="string")return issueAjaxRequest(n,e,null,null,{targetOverride:resolveTarget(t)||DUMMY_ELT,returnPromise:!0});{let i=resolveTarget(t.target);return(t.target&&!i||t.source&&!i&&!resolveTarget(t.source))&&(i=DUMMY_ELT),issueAjaxRequest(n,e,resolveTarget(t.source),t.event,{handler:t.handler,headers:t.headers,values:t.values,targetOverride:i,swapOverride:t.swap,select:t.select,returnPromise:!0,push:t.push,replace:t.replace,selectOOB:t.selectOOB})}}else return issueAjaxRequest(n,e,null,null,{returnPromise:!0})}function hierarchyForElt(n){let e=[];for(;n;)e.push(n),n=n.parentElement;return e}function verifyPath(n,e,t){let i=new URL(e,location.protocol!=="about:"?location.href:window.origin),o=(location.protocol!=="about:"?location.origin:window.origin)===i.origin;return htmx.config.selfRequestsOnly&&!o?!1:triggerEvent(n,"htmx:validateUrl",mergeObjects({url:i,sameHost:o},t))}function formDataFromObject(n){if(n instanceof FormData)return n;let e=new FormData;for(let t in n)n.hasOwnProperty(t)&&(n[t]&&typeof n[t].forEach=="function"?n[t].forEach(function(i){e.append(t,i)}):typeof n[t]=="object"&&!(n[t]instanceof Blob)?e.append(t,JSON.stringify(n[t])):e.append(t,n[t]));return e}function formDataArrayProxy(n,e,t){return new Proxy(t,{get:function(i,r){return typeof r=="number"?i[r]:r==="length"?i.length:r==="push"?function(o){i.push(o),n.append(e,o)}:typeof i[r]=="function"?function(){i[r].apply(i,arguments),n.delete(e),i.forEach(function(o){n.append(e,o)})}:i[r]&&i[r].length===1?i[r][0]:i[r]},set:function(i,r,o){return i[r]=o,n.delete(e),i.forEach(function(s){n.append(e,s)}),!0}})}function formDataProxy(n){return new Proxy(n,{get:function(e,t){if(typeof t=="symbol"){let r=Reflect.get(e,t);return typeof r=="function"?function(){return r.apply(n,arguments)}:r}if(t==="toJSON")return()=>Object.fromEntries(n);if(t in e&&typeof e[t]=="function")return function(){return n[t].apply(n,arguments)};let i=n.getAll(t);if(i.length!==0)return i.length===1?i[0]:formDataArrayProxy(e,t,i)},set:function(e,t,i){return typeof t!="string"?!1:(e.delete(t),i&&typeof i.forEach=="function"?i.forEach(function(r){e.append(t,r)}):typeof i=="object"&&!(i instanceof Blob)?e.append(t,JSON.stringify(i)):e.append(t,i),!0)},deleteProperty:function(e,t){return typeof t=="string"&&e.delete(t),!0},ownKeys:function(e){return Reflect.ownKeys(Object.fromEntries(e))},getOwnPropertyDescriptor:function(e,t){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(e),t)}})}function issueAjaxRequest(n,e,t,i,r,o){let s=null,a=null;if(r=r!=null?r:{},r.returnPromise&&typeof Promise!="undefined")var l=new Promise(function(U,ee){s=U,a=ee});t==null&&(t=getDocument().body);let c=r.handler||handleAjaxResponse,u=r.select||null;if(!bodyContains(t))return maybeCall(s),l;let d=r.targetOverride||asElement(getTarget(t));if(d==null||d==DUMMY_ELT)return triggerErrorEvent(t,"htmx:targetError",{target:getClosestAttributeValue(t,"hx-target")}),maybeCall(a),l;let p=getInternalData(t),y=p.lastButtonClicked;if(y){let U=getRawAttribute(y,"formaction");U!=null&&(e=U);let ee=getRawAttribute(y,"formmethod");if(ee!=null)if(VERBS.includes(ee.toLowerCase()))n=ee;else return maybeCall(s),l}let m=getClosestAttributeValue(t,"hx-confirm");if(o===void 0&&triggerEvent(t,"htmx:confirm",{target:d,elt:t,path:e,verb:n,triggeringEvent:i,etc:r,issueRequest:function(se){return issueAjaxRequest(n,e,t,i,r,!!se)},question:m})===!1)return maybeCall(s),l;let v=t,_=getClosestAttributeValue(t,"hx-sync"),C=null,D=!1;if(_){let U=_.split(":"),ee=U[0].trim();if(ee==="this"?v=findThisElement(t,"hx-sync"):v=asElement(querySelectorExt(t,ee)),_=(U[1]||"drop").trim(),p=getInternalData(v),_==="drop"&&p.xhr&&p.abortable!==!0)return maybeCall(s),l;if(_==="abort"){if(p.xhr)return maybeCall(s),l;D=!0}else _==="replace"?triggerEvent(v,"htmx:abort"):_.indexOf("queue")===0&&(C=(_.split(" ")[1]||"last").trim())}if(p.xhr)if(p.abortable)triggerEvent(v,"htmx:abort");else{if(C==null){if(i){let U=getInternalData(i);U&&U.triggerSpec&&U.triggerSpec.queue&&(C=U.triggerSpec.queue)}C==null&&(C="last")}return p.queuedRequests==null&&(p.queuedRequests=[]),C==="first"&&p.queuedRequests.length===0?p.queuedRequests.push(function(){issueAjaxRequest(n,e,t,i,r)}):C==="all"?p.queuedRequests.push(function(){issueAjaxRequest(n,e,t,i,r)}):C==="last"&&(p.queuedRequests=[],p.queuedRequests.push(function(){issueAjaxRequest(n,e,t,i,r)})),maybeCall(s),l}let w=new XMLHttpRequest;p.xhr=w,p.abortable=D;let T=function(){p.xhr=null,p.abortable=!1,p.queuedRequests!=null&&p.queuedRequests.length>0&&p.queuedRequests.shift()()},K=getClosestAttributeValue(t,"hx-prompt");if(K){var z=prompt(K);if(z===null||!triggerEvent(t,"htmx:prompt",{prompt:z,target:d}))return maybeCall(s),T(),l}if(m&&!o&&!confirm(m))return maybeCall(s),T(),l;let H=getHeaders(t,d,z);n!=="get"&&!usesFormData(t)&&(H["Content-Type"]="application/x-www-form-urlencoded"),r.headers&&(H=mergeObjects(H,r.headers));let R=getInputValues(t,n),L=R.errors,j=R.formData;r.values&&overrideFormData(j,formDataFromObject(r.values));let Y=formDataFromObject(getExpressionVars(t,i)),Q=overrideFormData(j,Y),Z=filterValues(Q,t);htmx.config.getCacheBusterParam&&n==="get"&&Z.set("org.htmx.cache-buster",getRawAttribute(d,"id")||"true"),(e==null||e==="")&&(e=location.href);let he=getValuesForElement(t,"hx-request"),Ce=getInternalData(t).boosted,re=htmx.config.methodsThatUseUrlParams.indexOf(n)>=0,ie={boosted:Ce,useUrlParams:re,formData:Z,parameters:formDataProxy(Z),unfilteredFormData:Q,unfilteredParameters:formDataProxy(Q),headers:H,elt:t,target:d,verb:n,errors:L,withCredentials:r.credentials||he.credentials||htmx.config.withCredentials,timeout:r.timeout||he.timeout||htmx.config.timeout,path:e,triggeringEvent:i};if(!triggerEvent(t,"htmx:configRequest",ie))return maybeCall(s),T(),l;if(e=ie.path,n=ie.verb,H=ie.headers,Z=formDataFromObject(ie.parameters),L=ie.errors,re=ie.useUrlParams,L&&L.length>0)return triggerEvent(t,"htmx:validation:halted",ie),maybeCall(s),T(),l;let Ue=e.split("#"),Ie=Ue[0],W=Ue[1],M=e;if(re&&(M=Ie,!Z.keys().next().done&&(M.indexOf("?")<0?M+="?":M+="&",M+=urlEncode(Z),W&&(M+="#"+W))),!verifyPath(t,M,ie))return triggerErrorEvent(t,"htmx:invalidPath",ie),maybeCall(a),T(),l;if(w.open(n.toUpperCase(),M,!0),w.overrideMimeType("text/html"),w.withCredentials=ie.withCredentials,w.timeout=ie.timeout,!he.noHeaders){for(let U in H)if(H.hasOwnProperty(U)){let ee=H[U];safelySetHeaderValue(w,U,ee)}}let S={xhr:w,target:d,requestConfig:ie,etc:r,boosted:Ce,select:u,pathInfo:{requestPath:e,finalRequestPath:M,responsePath:null,anchor:W}};if(w.onload=function(){try{let U=hierarchyForElt(t);if(S.pathInfo.responsePath=getPathFromResponse(w),c(t,S),S.keepIndicators!==!0&&removeRequestIndicators($,B),triggerEvent(t,"htmx:afterRequest",S),triggerEvent(t,"htmx:afterOnLoad",S),!bodyContains(t)){let ee=null;for(;U.length>0&&ee==null;){let se=U.shift();bodyContains(se)&&(ee=se)}ee&&(triggerEvent(ee,"htmx:afterRequest",S),triggerEvent(ee,"htmx:afterOnLoad",S))}maybeCall(s)}catch(U){throw triggerErrorEvent(t,"htmx:onLoadError",mergeObjects({error:U},S)),U}finally{T()}},w.onerror=function(){removeRequestIndicators($,B),triggerErrorEvent(t,"htmx:afterRequest",S),triggerErrorEvent(t,"htmx:sendError",S),maybeCall(a),T()},w.onabort=function(){removeRequestIndicators($,B),triggerErrorEvent(t,"htmx:afterRequest",S),triggerErrorEvent(t,"htmx:sendAbort",S),maybeCall(a),T()},w.ontimeout=function(){removeRequestIndicators($,B),triggerErrorEvent(t,"htmx:afterRequest",S),triggerErrorEvent(t,"htmx:timeout",S),maybeCall(a),T()},!triggerEvent(t,"htmx:beforeRequest",S))return maybeCall(s),T(),l;var $=addRequestIndicatorClasses(t),B=disableElements(t);forEach(["loadstart","loadend","progress","abort"],function(U){forEach([w,w.upload],function(ee){ee.addEventListener(U,function(se){triggerEvent(t,"htmx:xhr:"+U,{lengthComputable:se.lengthComputable,loaded:se.loaded,total:se.total})})})}),triggerEvent(t,"htmx:beforeSend",S);let q=re?null:encodeParamsForBody(w,t,Z);return w.send(q),l}function determineHistoryUpdates(n,e){let t=e.xhr,i=null,r=null;if(hasHeader(t,/HX-Push:/i)?(i=t.getResponseHeader("HX-Push"),r="push"):hasHeader(t,/HX-Push-Url:/i)?(i=t.getResponseHeader("HX-Push-Url"),r="push"):hasHeader(t,/HX-Replace-Url:/i)&&(i=t.getResponseHeader("HX-Replace-Url"),r="replace"),i)return i==="false"?{}:{type:r,path:i};let o=e.pathInfo.finalRequestPath,s=e.pathInfo.responsePath,a=e.etc.push||getClosestAttributeValue(n,"hx-push-url"),l=e.etc.replace||getClosestAttributeValue(n,"hx-replace-url"),c=getInternalData(n).boosted,u=null,d=null;return a?(u="push",d=a):l?(u="replace",d=l):c&&(u="push",d=s||o),d?d==="false"?{}:(d==="true"&&(d=s||o),e.pathInfo.anchor&&d.indexOf("#")===-1&&(d=d+"#"+e.pathInfo.anchor),{type:u,path:d}):{}}function codeMatches(n,e){var t=new RegExp(n.code);return t.test(e.toString(10))}function resolveResponseHandling(n){for(var e=0;e.${e}{opacity:0;visibility: hidden} .${t} .${e}, .${t}.${e}{opacity:1;visibility: visible;transition: opacity 200ms ease-in}`)}}function getMetaConfig(){let n=getDocument().querySelector('meta[name="htmx-config"]');return n?parseJSON(n.content):null}function mergeMetaConfig(){let n=getMetaConfig();n&&(htmx.config=mergeObjects(htmx.config,n))}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let n=getDocument().body;processNode(n);let e=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");n.addEventListener("htmx:abort",function(i){let r=i.detail.elt||i.target,o=getInternalData(r);o&&o.xhr&&o.xhr.abort()});let t=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(i){i.state&&i.state.htmx?(restoreHistory(),forEach(e,function(r){triggerEvent(r,"htmx:restored",{document:getDocument(),triggerEvent})})):t&&t(i)},getWindow().setTimeout(function(){triggerEvent(n,"htmx:load",{}),n=null},0)}),htmx})(),M_=em;function Ro(n,e){n.split(/\s+/).forEach(t=>{e(t)})}var si=class{constructor(){this._events={}}on(e,t){Ro(e,i=>{let r=this._events[i]||[];r.push(t),this._events[i]=r})}off(e,t){var i=arguments.length;if(i===0){this._events={};return}Ro(e,r=>{if(i===1){delete this._events[r];return}let o=this._events[r];o!==void 0&&(o.splice(o.indexOf(t),1),this._events[r]=o)})}trigger(e,...t){var i=this;Ro(e,r=>{let o=i._events[r];o!==void 0&&o.forEach(s=>{s.apply(i,t)})})}};function Io(n){return n.plugins={},class extends n{constructor(){super(...arguments),this.plugins={names:[],settings:{},requested:{},loaded:{}}}static define(e,t){n.plugins[e]={name:e,fn:t}}initializePlugins(e){var t,i;let r=this,o=[];if(Array.isArray(e))e.forEach(s=>{typeof s=="string"?o.push(s):(r.plugins.settings[s.name]=s.options,o.push(s.name))});else if(e)for(t in e)e.hasOwnProperty(t)&&(r.plugins.settings[t]=e[t],o.push(t));for(;i=o.shift();)r.require(i)}loadPlugin(e){var t=this,i=t.plugins,r=n.plugins[e];if(!n.plugins.hasOwnProperty(e))throw new Error('Unable to find "'+e+'" plugin');i.requested[e]=!0,i.loaded[e]=r.fn.apply(t,[t.plugins.settings[e]||{}]),i.names.push(e)}require(e){var t=this,i=t.plugins;if(!t.plugins.loaded.hasOwnProperty(e)){if(i.requested[e])throw new Error('Plugin has circular dependency ("'+e+'")');t.loadPlugin(e)}return i.loaded[e]}}}var ai=n=>(n=n.filter(Boolean),n.length<2?n[0]||"":nm(n)==1?"["+n.join("")+"]":"(?:"+n.join("|")+")"),Po=n=>{if(!tm(n))return n.join("");let e="",t=0,i=()=>{t>1&&(e+="{"+t+"}")};return n.forEach((r,o)=>{if(r===n[o-1]){t++;return}i(),e+=r,t=1}),i(),e},Fo=n=>{let e=Array.from(n);return ai(e)},tm=n=>new Set(n).size!==n.length,Lt=n=>(n+"").replace(/([\$\(\)\*\+\.\?\[\]\^\{\|\}\\])/gu,"\\$1"),nm=n=>n.reduce((e,t)=>Math.max(e,im(t)),0),im=n=>Array.from(n).length;var $o=n=>{if(n.length===1)return[[n]];let e=[],t=n.substring(1);return $o(t).forEach(function(r){let o=r.slice(0);o[0]=n.charAt(0)+o[0],e.push(o),o=r.slice(0),o.unshift(n.charAt(0)),e.push(o)}),e};var rm=[[0,65535]],om="[\u0300-\u036F\xB7\u02BE\u02BC]",sr,za,sm=3,Bo={},$a={"/":"\u2044\u2215",0:"\u07C0",a:"\u2C65\u0250\u0251",aa:"\uA733",ae:"\xE6\u01FD\u01E3",ao:"\uA735",au:"\uA737",av:"\uA739\uA73B",ay:"\uA73D",b:"\u0180\u0253\u0183",c:"\uA73F\u0188\u023C\u2184",d:"\u0111\u0257\u0256\u1D05\u018C\uABB7\u0501\u0266",e:"\u025B\u01DD\u1D07\u0247",f:"\uA77C\u0192",g:"\u01E5\u0260\uA7A1\u1D79\uA77F\u0262",h:"\u0127\u2C68\u2C76\u0265",i:"\u0268\u0131",j:"\u0249\u0237",k:"\u0199\u2C6A\uA741\uA743\uA745\uA7A3",l:"\u0142\u019A\u026B\u2C61\uA749\uA747\uA781\u026D",m:"\u0271\u026F\u03FB",n:"\uA7A5\u019E\u0272\uA791\u1D0E\u043B\u0509",o:"\xF8\u01FF\u0254\u0275\uA74B\uA74D\u1D11",oe:"\u0153",oi:"\u01A3",oo:"\uA74F",ou:"\u0223",p:"\u01A5\u1D7D\uA751\uA753\uA755\u03C1",q:"\uA757\uA759\u024B",r:"\u024D\u027D\uA75B\uA7A7\uA783",s:"\xDF\u023F\uA7A9\uA785\u0282",t:"\u0167\u01AD\u0288\u2C66\uA787",th:"\xFE",tz:"\uA729",u:"\u0289",v:"\u028B\uA75F\u028C",vy:"\uA761",w:"\u2C73",y:"\u01B4\u024F\u1EFF",z:"\u01B6\u0225\u0240\u2C6C\uA763",hv:"\u0195"};for(let n in $a){let e=$a[n]||"";for(let t=0;t{sr===void 0&&(sr=fm(n||rm))},Ba=(n,e="NFKD")=>n.normalize(e),li=n=>Array.from(n).reduce((e,t)=>e+cm(t),""),cm=n=>(n=Ba(n).toLowerCase().replace(am,e=>Bo[e]||""),Ba(n,"NFC"));function*um(n){for(let[e,t]of n)for(let i=e;i<=t;i++){let r=String.fromCharCode(i),o=li(r);o!=r.toLowerCase()&&(o.length>sm||o.length!=0&&(yield{folded:o,composed:r,code_point:i}))}}var dm=n=>{let e={},t=(i,r)=>{let o=e[i]||new Set,s=new RegExp("^"+Fo(o)+"$","iu");r.match(s)||(o.add(Lt(r)),e[i]=o)};for(let i of um(n))t(i.folded,i.folded),t(i.folded,i.composed);return e},fm=n=>{let e=dm(n),t={},i=[];for(let o in e){let s=e[o];s&&(t[o]=Fo(s)),o.length>1&&i.push(Lt(o))}i.sort((o,s)=>s.length-o.length);let r=ai(i);return za=new RegExp("^"+r,"u"),t},hm=(n,e=1)=>{let t=0;return n=n.map(i=>(sr[i]&&(t+=i.length),sr[i]||i)),t>=e?Po(n):""},pm=(n,e=1)=>(e=Math.max(e,n.length-1),ai($o(n).map(t=>hm(t,e)))),Va=(n,e=!0)=>{let t=n.length>1?1:0;return ai(n.map(i=>{let r=[],o=e?i.length():i.length()-1;for(let s=0;s{for(let t of e){if(t.start!=n.start||t.end!=n.end||t.substrs.join("")!==n.substrs.join(""))continue;let i=n.parts,r=s=>{for(let a of i){if(a.start===s.start&&a.substr===s.substr)return!1;if(!(s.length==1||a.length==1)&&(s.starta.start||a.starts.start))return!0}return!1};if(!(t.parts.filter(r).length>0))return!0}return!1},ar=class n{constructor(){te(this,"parts");te(this,"substrs");te(this,"start");te(this,"end");this.parts=[],this.substrs=[],this.start=0,this.end=0}add(e){e&&(this.parts.push(e),this.substrs.push(e.substr),this.start=Math.min(e.start,this.start),this.end=Math.max(e.end,this.end))}last(){return this.parts[this.parts.length-1]}length(){return this.parts.length}clone(e,t){let i=new n,r=JSON.parse(JSON.stringify(this.parts)),o=r.pop();for(let l of r)i.add(l);let s=t.substr.substring(0,e-o.start),a=s.length;return i.add({start:o.start,end:o.start+a,length:a,substr:s}),i}},ja=n=>{lm(),n=li(n);let e="",t=[new ar];for(let i=0;i0){l=l.sort((u,d)=>u.length()-d.length());for(let u of l)mm(u,t)||t.push(u);continue}if(i>0&&c.size==1&&!c.has("3")){e+=Va(t,!1);let u=new ar,d=t[0];d&&u.add(d.last()),t=[u]}}return e+=Va(t,!0),e};var Wa=(n,e)=>{if(n)return n[e]},qa=(n,e)=>{if(n){for(var t,i=e.split(".");(t=i.shift())&&(n=n[t]););return n}},lr=(n,e,t)=>{var i,r;return!n||(n=n+"",e.regex==null)||(r=n.search(e.regex),r===-1)?0:(i=e.string.length/n.length,r===0&&(i+=.5),i*t)},cr=(n,e)=>{var t=n[e];if(typeof t=="function")return t;t&&!Array.isArray(t)&&(n[e]=[t])},ci=(n,e)=>{if(Array.isArray(n))n.forEach(e);else for(var t in n)n.hasOwnProperty(t)&&e(n[t],t)},Ua=(n,e)=>typeof n=="number"&&typeof e=="number"?n>e?1:ne?1:e>n?-1:0);var ur=class{constructor(e,t){te(this,"items");te(this,"settings");this.items=e,this.settings=t||{diacritics:!0}}tokenize(e,t,i){if(!e||!e.length)return[];let r=[],o=e.split(/\s+/);var s;return i&&(s=new RegExp("^("+Object.keys(i).map(Lt).join("|")+"):(.*)$")),o.forEach(a=>{let l,c=null,u=null;s&&(l=a.match(s))&&(c=l[1],a=l[2]),a.length>0&&(this.settings.diacritics?u=ja(a)||null:u=Lt(a),u&&t&&(u="\\b"+u)),r.push({string:a,regex:u?new RegExp(u,"iu"):null,field:c})}),r}getScoreFunction(e,t){var i=this.prepareSearch(e,t);return this._getScoreFunction(i)}_getScoreFunction(e){let t=e.tokens,i=t.length;if(!i)return function(){return 0};let r=e.options.fields,o=e.weights,s=r.length,a=e.getAttrFn;if(!s)return function(){return 1};let l=(function(){return s===1?function(c,u){let d=r[0].field;return lr(a(u,d),c,o[d]||1)}:function(c,u){var d=0;if(c.field){let p=a(u,c.field);!c.regex&&p?d+=1/s:d+=lr(p,c,1)}else ci(o,(p,y)=>{d+=lr(a(u,y),c,p)});return d/s}})();return i===1?function(c){return l(t[0],c)}:e.options.conjunction==="and"?function(c){var u,d=0;for(let p of t){if(u=l(p,c),u<=0)return 0;d+=u}return d/i}:function(c){var u=0;return ci(t,d=>{u+=l(d,c)}),u/i}}getSortFunction(e,t){var i=this.prepareSearch(e,t);return this._getSortFunction(i)}_getSortFunction(e){var t,i=[];let r=this,o=e.options,s=!e.query&&o.sort_empty?o.sort_empty:o.sort;if(typeof s=="function")return s.bind(this);let a=function(c,u){return c==="$score"?u.score:e.getAttrFn(r.items[u.id],c)};if(s)for(let c of s)(e.query||c.field!=="$score")&&i.push(c);if(e.query){t=!0;for(let c of i)if(c.field==="$score"){t=!1;break}t&&i.unshift({field:"$score",direction:"desc"})}else i=i.filter(c=>c.field!=="$score");return i.length?function(c,u){var d,p;for(let y of i)if(p=y.field,d=(y.direction==="desc"?-1:1)*Ua(a(p,c),a(p,u)),d)return d;return 0}:null}prepareSearch(e,t){let i={};var r=Object.assign({},t);if(cr(r,"sort"),cr(r,"sort_empty"),r.fields){cr(r,"fields");let o=[];r.fields.forEach(s=>{typeof s=="string"&&(s={field:s,weight:1}),o.push(s),i[s.field]="weight"in s?s.weight:1}),r.fields=o}return{options:r,query:e.toLowerCase().trim(),tokens:this.tokenize(e,r.respect_word_boundaries,i),total:0,items:[],weights:i,getAttrFn:r.nesting?qa:Wa}}search(e,t){var i=this,r,o;o=this.prepareSearch(e,t),t=o.options,e=o.query;let s=t.score||i._getScoreFunction(o);e.length?ci(i.items,(l,c)=>{r=s(l),(t.filter===!1||r>0)&&o.items.push({score:r,id:c})}):ci(i.items,(l,c)=>{o.items.push({score:1,id:c})});let a=i._getSortFunction(o);return a&&o.items.sort(a),o.total=o.items.length,typeof t.limit=="number"&&(o.items=o.items.slice(0,t.limit)),o}};var Fe=n=>typeof n=="undefined"||n===null?null:ui(n),ui=n=>typeof n=="boolean"?n?"1":"0":n+"",dr=n=>(n+"").replace(/&/g,"&").replace(//g,">").replace(/"/g,"""),Ya=(n,e)=>e>0?window.setTimeout(n,e):(n.call(null),null),Ga=(n,e)=>{var t;return function(i,r){var o=this;t&&(o.loading=Math.max(o.loading-1,0),clearTimeout(t)),t=setTimeout(function(){t=null,o.loadedSearches[i]=!0,n.call(o,i,r)},e)}},Vo=(n,e,t)=>{var i,r=n.trigger,o={};n.trigger=function(){var s=arguments[0];if(e.indexOf(s)!==-1)o[s]=arguments;else return r.apply(n,arguments)},t.apply(n,[]),n.trigger=r;for(i of e)i in o&&r.apply(n,o[i])},Ka=n=>({start:n.selectionStart||0,length:(n.selectionEnd||0)-(n.selectionStart||0)}),fe=(n,e=!1)=>{n&&(n.preventDefault(),e&&n.stopPropagation())},De=(n,e,t,i)=>{n.addEventListener(e,t,i)},Mt=(n,e)=>{if(!e||!e[n])return!1;var t=(e.altKey?1:0)+(e.ctrlKey?1:0)+(e.shiftKey?1:0)+(e.metaKey?1:0);return t===1},fr=(n,e)=>{let t=n.getAttribute("id");return t||(n.setAttribute("id",e),e)},zo=n=>n.replace(/[\\"']/g,"\\$&"),Nt=(n,e)=>{e&&n.append(e)},ve=(n,e)=>{if(Array.isArray(n))n.forEach(e);else for(var t in n)n.hasOwnProperty(t)&&e(n[t],t)};var nt=n=>{if(n.jquery)return n[0];if(n instanceof HTMLElement)return n;if(jo(n)){var e=document.createElement("template");return e.innerHTML=n.trim(),e.content.firstChild}return document.querySelector(n)},jo=n=>typeof n=="string"&&n.indexOf("<")>-1,Xa=n=>n.replace(/['"\\]/g,"\\$&"),hr=(n,e)=>{var t=document.createEvent("HTMLEvents");t.initEvent(e,!0,!1),n.dispatchEvent(t)},di=(n,e)=>{Object.assign(n.style,e)},$e=(n,...e)=>{var t=Qa(e);n=Ja(n),n.map(i=>{t.map(r=>{i.classList.add(r)})})},gt=(n,...e)=>{var t=Qa(e);n=Ja(n),n.map(i=>{t.map(r=>{i.classList.remove(r)})})},Qa=n=>{var e=[];return ve(n,t=>{typeof t=="string"&&(t=t.trim().split(/[\t\n\f\r\s]/)),Array.isArray(t)&&(e=e.concat(t))}),e.filter(Boolean)},Ja=n=>(Array.isArray(n)||(n=[n]),n),pr=(n,e,t)=>{if(!(t&&!t.contains(n)))for(;n&&n.matches;){if(n.matches(e))return n;n=n.parentNode}},Wo=(n,e=0)=>e>0?n[n.length-1]:n[0],Za=n=>Object.keys(n).length===0,qo=(n,e)=>{if(!n)return-1;e=e||n.nodeName;for(var t=0;n=n.previousElementSibling;)n.matches(e)&&t++;return t},le=(n,e)=>{ve(e,(t,i)=>{t==null?n.removeAttribute(i):n.setAttribute(i,""+t)})},fi=(n,e)=>{n.parentNode&&n.parentNode.replaceChild(e,n)};var el=(n,e)=>{if(e===null)return;if(typeof e=="string"){if(!e.length)return;e=new RegExp(e,"i")}let t=o=>{var s=o.data.match(e);if(s&&o.data.length>0){var a=document.createElement("span");a.className="highlight";var l=o.splitText(s.index);l.splitText(s[0].length);var c=l.cloneNode(!0);return a.appendChild(c),fi(l,a),1}return 0},i=o=>{o.nodeType===1&&o.childNodes&&!/(script|style)/i.test(o.tagName)&&(o.className!=="highlight"||o.tagName!=="SPAN")&&Array.from(o.childNodes).forEach(s=>{r(s)})},r=o=>o.nodeType===3?t(o):(i(o),0);r(n)},tl=n=>{var e=n.querySelectorAll("span.highlight");Array.prototype.forEach.call(e,function(t){var i=t.parentNode;i.replaceChild(t.firstChild,t),i.normalize()})};var gm=typeof navigator=="undefined"?!1:/Mac/.test(navigator.userAgent),hi=gm?"metaKey":"ctrlKey";var Uo={options:[],optgroups:[],plugins:[],delimiter:",",splitOn:null,persist:!0,diacritics:!0,create:null,createOnBlur:!1,createFilter:null,clearAfterSelect:!1,highlight:!0,openOnFocus:!0,shouldOpen:null,maxOptions:50,maxItems:null,hideSelected:null,duplicates:!1,addPrecedence:!1,selectOnTab:!1,preload:null,allowEmptyOption:!1,refreshThrottle:300,loadThrottle:300,loadingClass:"loading",dataAttr:null,optgroupField:"optgroup",valueField:"value",labelField:"text",disabledField:"disabled",optgroupLabelField:"label",optgroupValueField:"value",lockOptgroupOrder:!1,sortField:"$order",searchField:["text"],searchConjunction:"and",mode:null,wrapperClass:"ts-wrapper",controlClass:"ts-control",dropdownClass:"ts-dropdown",dropdownContentClass:"ts-dropdown-content",itemClass:"item",optionClass:"option",dropdownParent:null,controlInput:'',copyClassesToDropdown:!1,placeholder:null,hidePlaceholder:null,shouldLoad:function(n){return n.length>0},render:{}};function mr(n,e){var t=Object.assign({},Uo,e),i=t.dataAttr,r=t.labelField,o=t.valueField,s=t.disabledField,a=t.optgroupField,l=t.optgroupLabelField,c=t.optgroupValueField,u=n.tagName.toLowerCase(),d=n.getAttribute("placeholder")||n.getAttribute("data-placeholder");if(!d&&!t.allowEmptyOption){let v=n.querySelector('option[value=""]');v&&(d=v.textContent)}var p={placeholder:d,options:[],optgroups:[],items:[],maxItems:null},y=()=>{var v,_=p.options,C={},D=1;let w=0;var T=H=>{var R=Object.assign({},H.dataset),L=i&&R[i];return typeof L=="string"&&L.length&&(R=Object.assign(R,JSON.parse(L))),R},K=(H,R)=>{var L=Fe(H.value);if(L!=null&&!(!L&&!t.allowEmptyOption)){if(C.hasOwnProperty(L)){if(R){var j=C[L][a];j?Array.isArray(j)?j.push(R):C[L][a]=[j,R]:C[L][a]=R}}else{var Y=T(H);Y[r]=Y[r]||H.textContent,Y[o]=Y[o]||L,Y[s]=Y[s]||H.disabled,Y[a]=Y[a]||R,Y.$option=H,Y.$order=Y.$order||++w,C[L]=Y,_.push(Y)}H.selected&&p.items.push(L)}},z=H=>{var R,L;L=T(H),L[l]=L[l]||H.getAttribute("label")||"",L[c]=L[c]||D++,L[s]=L[s]||H.disabled,L.$order=L.$order||++w,p.optgroups.push(L),R=L[c],ve(H.children,j=>{K(j,R)})};p.maxItems=n.hasAttribute("multiple")?null:1,ve(n.children,H=>{v=H.tagName.toLowerCase(),v==="optgroup"?z(H):v==="option"&&K(H)})},m=()=>{let v=n.getAttribute(i);if(v)p.options=JSON.parse(v),ve(p.options,C=>{p.items.push(C[o])});else{var _=n.value.trim()||"";if(!t.allowEmptyOption&&!_.length)return;let C=_.split(t.delimiter);ve(C,D=>{let w={};w[r]=D,w[o]=D,p.options.push(w)}),p.items=C}};return u==="select"?y():m(),Object.assign({},Uo,p,e)}var rl=0,we=class extends Io(si){constructor(e,t){super(),this.order=0,this.isOpen=!1,this.isDisabled=!1,this.isReadOnly=!1,this.isInvalid=!1,this.isValid=!0,this.isLocked=!1,this.isFocused=!1,this.isInputHidden=!1,this.isSetup=!1,this.ignoreFocus=!1,this.ignoreHover=!1,this.hasOptions=!1,this.lastValue="",this.caretPos=0,this.loading=0,this.loadedSearches={},this.activeOption=null,this.activeItems=[],this.optgroups={},this.options={},this.userOptions={},this.items=[],this.refreshTimeout=null,rl++;var i,r=nt(e);if(r.tomselect)throw new Error("Tom Select already initialized on this element");r.tomselect=this;var o=window.getComputedStyle&&window.getComputedStyle(r,null);i=o.getPropertyValue("direction");let s=mr(r,t);this.settings=s,this.input=r,this.tabIndex=r.tabIndex||0,this.is_select_tag=r.tagName.toLowerCase()==="select",this.rtl=/rtl/i.test(i),this.inputId=fr(r,"tomselect-"+rl),this.isRequired=r.required,this.sifter=new ur(this.options,{diacritics:s.diacritics}),s.mode=s.mode||(s.maxItems===1?"single":"multi"),typeof s.hideSelected!="boolean"&&(s.hideSelected=s.mode==="multi"),typeof s.hidePlaceholder!="boolean"&&(s.hidePlaceholder=s.mode!=="multi");var a=s.createFilter;typeof a!="function"&&(typeof a=="string"&&(a=new RegExp(a)),a instanceof RegExp?s.createFilter=_=>a.test(_):s.createFilter=_=>this.settings.duplicates||!this.options[_]),this.initializePlugins(s.plugins),this.setupCallbacks(),this.setupTemplates();let l=nt("
    "),c=nt("
    "),u=this._render("dropdown"),d=nt('
    '),p=this.input.getAttribute("class")||"",y=s.mode;var m;if($e(l,s.wrapperClass,p,y),$e(c,s.controlClass),Nt(l,c),$e(u,s.dropdownClass,y),s.copyClassesToDropdown&&$e(u,p),$e(d,s.dropdownContentClass),Nt(u,d),nt(s.dropdownParent||l).appendChild(u),jo(s.controlInput)){m=nt(s.controlInput);var v=["autocorrect","autocapitalize","autocomplete","spellcheck","aria-label"];ve(v,_=>{r.getAttribute(_)&&le(m,{[_]:r.getAttribute(_)})}),m.tabIndex=-1,c.appendChild(m),this.focus_node=m}else s.controlInput?(m=nt(s.controlInput),this.focus_node=m):(m=nt(""),this.focus_node=c);this.wrapper=l,this.dropdown=u,this.dropdown_content=d,this.control=c,this.control_input=m,this.setup()}setup(){let e=this,t=e.settings,i=e.control_input,r=e.dropdown,o=e.dropdown_content,s=e.wrapper,a=e.control,l=e.input,c=e.focus_node,u={passive:!0},d=e.inputId+"-ts-dropdown";le(o,{id:d}),le(c,{role:"combobox","aria-haspopup":"listbox","aria-expanded":"false","aria-controls":d});let p=fr(c,e.inputId+"-ts-control"),y="label[for='"+Xa(e.inputId)+"']",m=document.querySelector(y),v=e.focus.bind(e);if(m){De(m,"click",v),le(m,{for:p});let w=fr(m,e.inputId+"-ts-label");le(c,{"aria-labelledby":w}),le(o,{"aria-labelledby":w})}if(s.style.width=l.style.width,s.style.minWidth=l.style.minWidth,s.style.maxWidth=l.style.maxWidth,e.plugins.names.length){let w="plugin-"+e.plugins.names.join(" plugin-");$e([s,r],w)}(t.maxItems===null||t.maxItems>1)&&e.is_select_tag&&le(l,{multiple:"multiple"}),t.placeholder&&le(i,{placeholder:t.placeholder}),!t.splitOn&&t.delimiter&&(t.splitOn=new RegExp("\\s*"+Lt(t.delimiter)+"+\\s*")),t.load&&t.loadThrottle&&(t.load=Ga(t.load,t.loadThrottle)),De(r,"mousemove",()=>{e.ignoreHover=!1}),De(r,"mouseenter",w=>{var T=pr(w.target,"[data-selectable]",r);T&&e.onOptionHover(w,T)},{capture:!0}),De(r,"click",w=>{let T=pr(w.target,"[data-selectable]");T&&(e.onOptionSelect(w,T),fe(w,!0))}),De(a,"click",w=>{var T=pr(w.target,"[data-ts-item]",a);if(T&&e.onItemSelect(w,T)){fe(w,!0);return}i.value==""&&(e.onClick(),fe(w,!0))}),De(c,"keydown",w=>e.onKeyDown(w)),De(i,"keypress",w=>e.onKeyPress(w)),De(i,"input",w=>e.onInput(w)),De(c,"blur",w=>e.onBlur(w)),De(c,"focus",w=>e.onFocus(w)),De(i,"paste",w=>e.onPaste(w));let _=w=>{let T=w.composedPath()[0];if(!s.contains(T)&&!r.contains(T)){e.isFocused&&e.blur(),e.inputState();return}T==i&&e.isOpen?w.stopPropagation():fe(w,!0)},C=()=>{e.isOpen&&e.positionDropdown()},D=()=>{e.isValid&&(e.isValid=!1,e.isInvalid=!0,e.refreshState())};De(l,"invalid",D),De(document,"mousedown",_),De(window,"scroll",C,u),De(window,"resize",C,u),this._destroy=()=>{l.removeEventListener("invalid",D),document.removeEventListener("mousedown",_),window.removeEventListener("scroll",C),window.removeEventListener("resize",C),m&&m.removeEventListener("click",v)},this.revertSettings={innerHTML:l.innerHTML,tabIndex:l.tabIndex},l.tabIndex=-1,l.insertAdjacentElement("afterend",e.wrapper),e.sync(!1),t.items=[],delete t.optgroups,delete t.options,e.refreshItems(),e.close(!1),e.inputState(),e.isSetup=!0,l.disabled?e.disable():l.readOnly?e.setReadOnly(!0):e.enable(),e.on("change",this.onChange),$e(l,"tomselected","ts-hidden-accessible"),e.trigger("initialize"),t.preload===!0&&e.preload()}setupOptions(e=[],t=[]){this.addOptions(e),ve(t,i=>{this.registerOptionGroup(i)})}setupTemplates(){var e=this,t=e.settings.labelField,i=e.settings.optgroupLabelField,r={optgroup:o=>{let s=document.createElement("div");return s.className="optgroup",s.appendChild(o.options),s},optgroup_header:(o,s)=>'
    '+s(o[i])+"
    ",option:(o,s)=>"
    "+s(o[t])+"
    ",item:(o,s)=>"
    "+s(o[t])+"
    ",option_create:(o,s)=>'
    Add '+s(o.input)+"
    ",no_results:()=>'
    No results found
    ',loading:()=>'
    ',not_loading:()=>{},dropdown:()=>"
    "};e.settings.render=Object.assign({},r,e.settings.render)}setupCallbacks(){var e,t,i={initialize:"onInitialize",change:"onChange",item_add:"onItemAdd",item_remove:"onItemRemove",item_select:"onItemSelect",clear:"onClear",option_add:"onOptionAdd",option_remove:"onOptionRemove",option_clear:"onOptionClear",optgroup_add:"onOptionGroupAdd",optgroup_remove:"onOptionGroupRemove",optgroup_clear:"onOptionGroupClear",dropdown_open:"onDropdownOpen",dropdown_close:"onDropdownClose",type:"onType",load:"onLoad",focus:"onFocus",blur:"onBlur"};for(e in i)t=this.settings[i[e]],t&&this.on(e,t)}sync(e=!0){let t=this,i=e?mr(t.input,{delimiter:t.settings.delimiter,allowEmptyOption:t.settings.allowEmptyOption}):t.settings;t.setupOptions(i.options,i.optgroups),t.setValue(i.items||[],!0),t.lastQuery=null}onClick(){var e=this;if(e.activeItems.length>0){e.clearActiveItems(),e.focus();return}e.isFocused&&e.isOpen?e.blur():e.focus()}onMouseDown(){}onChange(){hr(this.input,"input"),hr(this.input,"change")}onPaste(e){var t=this;if(t.isInputHidden||t.isLocked){fe(e);return}t.settings.splitOn&&setTimeout(()=>{var i=t.inputValue();if(i.match(t.settings.splitOn)){var r=i.trim().split(t.settings.splitOn);ve(r,o=>{Fe(o)&&(this.options[o]?t.addItem(o):t.createItem(o))})}},0)}onKeyPress(e){var t=this;if(t.isLocked){fe(e);return}var i=String.fromCharCode(e.keyCode||e.which);if(t.settings.create&&t.settings.mode==="multi"&&i===t.settings.delimiter){t.createItem(),fe(e);return}}onKeyDown(e){var t=this;if(t.ignoreHover=!0,t.isLocked){e.keyCode!==9&&fe(e);return}switch(e.keyCode){case 65:if(Mt(hi,e)&&t.control_input.value==""){fe(e),t.selectAll();return}break;case 27:t.isOpen&&(fe(e,!0),t.close()),t.clearActiveItems();return;case 40:if(!t.isOpen&&t.hasOptions)t.open();else if(t.activeOption){let i=t.getAdjacent(t.activeOption,1);i&&t.setActiveOption(i)}fe(e);return;case 38:if(t.activeOption){let i=t.getAdjacent(t.activeOption,-1);i&&t.setActiveOption(i)}fe(e);return;case 13:t.canSelect(t.activeOption)?(t.onOptionSelect(e,t.activeOption),fe(e)):t.settings.create&&t.createItem()?fe(e):document.activeElement==t.control_input&&t.isOpen&&fe(e);return;case 37:t.advanceSelection(-1,e);return;case 39:t.advanceSelection(1,e);return;case 9:t.settings.selectOnTab&&(t.canSelect(t.activeOption)?(t.onOptionSelect(e,t.activeOption),fe(e)):t.settings.create&&t.createItem()&&fe(e));return;case 8:case 46:t.deleteSelection(e);return}t.isInputHidden&&!Mt(hi,e)&&fe(e)}onInput(e){if(this.isLocked)return;let t=this.inputValue();if(this.lastValue!==t){if(this.lastValue=t,t==""){this._onInput();return}this.refreshTimeout&&window.clearTimeout(this.refreshTimeout),this.refreshTimeout=Ya(()=>{this.refreshTimeout=null,this._onInput()},this.settings.refreshThrottle)}}_onInput(){let e=this.lastValue;this.settings.shouldLoad.call(this,e)&&this.load(e),this.refreshOptions(),this.trigger("type",e)}onOptionHover(e,t){this.ignoreHover||this.setActiveOption(t,!1)}onFocus(e){var t=this,i=t.isFocused;if(t.isDisabled||t.isReadOnly){t.blur(),fe(e);return}t.ignoreFocus||(t.isFocused=!0,t.settings.preload==="focus"&&t.preload(),i||t.trigger("focus"),t.activeItems.length||(t.inputState(),t.refreshOptions(!!t.settings.openOnFocus)),t.refreshState())}onBlur(e){if(document.hasFocus()!==!1){var t=this;if(t.isFocused){t.isFocused=!1,t.ignoreFocus=!1;var i=()=>{t.close(),t.setActiveItem(),t.setCaret(t.items.length),t.trigger("blur")};t.settings.create&&t.settings.createOnBlur?t.createItem(null,i):i()}}}onOptionSelect(e,t){var i,r=this;t.parentElement&&t.parentElement.matches("[data-disabled]")||(t.classList.contains("create")?r.createItem(null,()=>{r.settings.closeAfterSelect?r.close():r.settings.clearAfterSelect&&r.setTextboxValue()}):(i=t.dataset.value,typeof i!="undefined"&&(r.lastQuery=null,r.addItem(i),r.settings.closeAfterSelect?r.close():r.settings.clearAfterSelect&&r.setTextboxValue(),!r.settings.hideSelected&&e.type&&/click/.test(e.type)&&r.setActiveOption(t))))}canSelect(e){return!!(this.isOpen&&e&&this.dropdown_content.contains(e))}onItemSelect(e,t){var i=this;return!i.isLocked&&i.settings.mode==="multi"?(fe(e),i.setActiveItem(t,e),!0):!1}canLoad(e){return!(!this.settings.load||this.loadedSearches.hasOwnProperty(e))}load(e){let t=this;if(!t.canLoad(e))return;$e(t.wrapper,t.settings.loadingClass),t.loading++;let i=t.loadCallback.bind(t);t.settings.load.call(t,e,i)}loadCallback(e,t){let i=this;i.loading=Math.max(i.loading-1,0),i.lastQuery=null,i.clearActiveOption(),i.setupOptions(e,t),i.refreshOptions(i.isFocused&&!i.isInputHidden),i.loading||gt(i.wrapper,i.settings.loadingClass),i.trigger("load",e,t)}preload(){var e=this.wrapper.classList;e.contains("preloaded")||(e.add("preloaded"),this.load(""))}setTextboxValue(e=""){var t=this.control_input,i=t.value!==e;i&&(t.value=e,hr(t,"update"),this.lastValue=e)}getValue(){return this.is_select_tag&&this.input.hasAttribute("multiple")?this.items:this.items.join(this.settings.delimiter)}setValue(e,t){var i=t?[]:["change"];Vo(this,i,()=>{this.clear(t),this.addItems(e,t)})}setMaxItems(e){e===0&&(e=null),this.settings.maxItems=e,this.refreshState()}setActiveItem(e,t){var i=this,r,o,s,a,l,c;if(i.settings.mode!=="single"){if(!e){i.clearActiveItems(),i.isFocused&&i.inputState();return}if(r=t&&t.type.toLowerCase(),r==="click"&&Mt("shiftKey",t)&&i.activeItems.length){for(c=i.getLastActive(),s=Array.prototype.indexOf.call(i.control.children,c),a=Array.prototype.indexOf.call(i.control.children,e),s>a&&(l=s,s=a,a=l),o=s;o<=a;o++)e=i.control.children[o],i.activeItems.indexOf(e)===-1&&i.setActiveItemClass(e);fe(t)}else r==="click"&&Mt(hi,t)||r==="keydown"&&Mt("shiftKey",t)?e.classList.contains("active")?i.removeActiveItem(e):i.setActiveItemClass(e):(i.clearActiveItems(),i.setActiveItemClass(e));i.inputState(),i.isFocused||i.focus()}}setActiveItemClass(e){let t=this,i=t.control.querySelector(".last-active");i&>(i,"last-active"),$e(e,"active last-active"),t.trigger("item_select",e),t.activeItems.indexOf(e)==-1&&t.activeItems.push(e)}removeActiveItem(e){var t=this.activeItems.indexOf(e);this.activeItems.splice(t,1),gt(e,"active")}clearActiveItems(){gt(this.activeItems,"active"),this.activeItems=[]}setActiveOption(e,t=!0){e!==this.activeOption&&(this.clearActiveOption(),e&&(this.activeOption=e,le(this.focus_node,{"aria-activedescendant":e.getAttribute("id")}),le(e,{"aria-selected":"true"}),$e(e,"active"),t&&this.scrollToOption(e)))}scrollToOption(e,t){if(!e)return;let i=this.dropdown_content,r=i.clientHeight,o=i.scrollTop||0,s=e.offsetHeight,a=e.getBoundingClientRect().top-i.getBoundingClientRect().top+o;a+s>r+o?this.scroll(a-r+s,t):a{e.setActiveItemClass(i)}))}inputState(){var e=this;e.control.contains(e.control_input)&&(le(e.control_input,{placeholder:e.settings.placeholder}),e.activeItems.length>0||!e.isFocused&&e.settings.hidePlaceholder&&e.items.length>0?(e.setTextboxValue(),e.isInputHidden=!0):(e.settings.hidePlaceholder&&e.items.length>0&&le(e.control_input,{placeholder:""}),e.isInputHidden=!1),e.wrapper.classList.toggle("input-hidden",e.isInputHidden))}inputValue(){return this.control_input.value.trim()}focus(){var e=this;e.isDisabled||e.isReadOnly||(e.ignoreFocus=!0,e.control_input.offsetWidth?e.control_input.focus():e.focus_node.focus(),setTimeout(()=>{e.ignoreFocus=!1,e.onFocus()},0))}blur(){this.focus_node.blur(),this.onBlur()}getScoreFunction(e){return this.sifter.getScoreFunction(e,this.getSearchOptions())}getSearchOptions(){var e=this.settings,t=e.sortField;return typeof e.sortField=="string"&&(t=[{field:e.sortField}]),{fields:e.searchField,conjunction:e.searchConjunction,sort:t,nesting:e.nesting}}search(e){var t,i,r=this,o=this.getSearchOptions();if(r.settings.score&&(i=r.settings.score.call(r,e),typeof i!="function"))throw new Error('Tom Select "score" setting must be a function that returns a function');return e!==r.lastQuery?(r.lastQuery=e,/(.)\1{15,}/.test(e)&&(e=""),t=r.sifter.search(e,Object.assign(o,{score:i})),r.currentResults=t):t=Object.assign({},r.currentResults),r.settings.hideSelected&&(t.items=t.items.filter(s=>{let a=Fe(s.id);return!(a!==null&&r.items.indexOf(a)!==-1)})),t}refreshOptions(e=!0){var t,i,r,o,s,a,l,c,u,d;let p={},y=[];var m=this,v=m.inputValue();let _=v===m.lastQuery||v==""&&m.lastQuery==null;var C=m.search(v),D=null,w=m.settings.shouldOpen||!1,T=m.dropdown_content;_&&(D=m.activeOption,D&&(u=D.closest("[data-group]"))),o=C.items.length,typeof m.settings.maxOptions=="number"&&(o=Math.min(o,m.settings.maxOptions)),o>0&&(w=!0);let K=(R,L)=>{let j=p[R];if(j!==void 0){let Q=y[j];if(Q!==void 0)return[j,Q.fragment]}let Y=document.createDocumentFragment();return j=y.length,y.push({fragment:Y,order:L,optgroup:R}),[j,Y]};for(t=0;t0&&(Q=Q.cloneNode(!0),le(Q,{id:j.$id+"-clone-"+i,"aria-selected":null}),Q.classList.add("ts-cloned"),gt(Q,"active"),m.activeOption&&m.activeOption.dataset.value==L&&u&&u.dataset.group===s.toString()&&(D=Q)),re.appendChild(Q),s!=""&&(p[s]=Ce)}}m.settings.lockOptgroupOrder&&y.sort((R,L)=>R.order-L.order),l=document.createDocumentFragment(),ve(y,R=>{let L=R.fragment,j=R.optgroup;if(!L||!L.children.length)return;let Y=m.optgroups[j];if(Y!==void 0){let Q=document.createDocumentFragment(),Z=m.render("optgroup_header",Y);Nt(Q,Z),Nt(Q,L);let he=m.render("optgroup",{group:Y,options:Q});Nt(l,he)}else Nt(l,L)}),T.innerHTML="",Nt(T,l),m.settings.highlight&&(tl(T),C.query.length&&C.tokens.length&&ve(C.tokens,R=>{el(T,R.regex)}));var H=R=>{let L=m.render(R,{input:v});return L&&(w=!0,T.insertBefore(L,T.firstChild)),L};if(m.loading?H("loading"):m.settings.shouldLoad.call(m,v)?C.items.length===0&&H("no_results"):H("not_loading"),c=m.canCreate(v),c&&(d=H("option_create")),m.hasOptions=C.items.length>0||c,w){if(C.items.length>0){if(!D&&m.settings.mode==="single"&&m.items[0]!=null&&(D=m.getOption(m.items[0])),!T.contains(D)){let R=0;d&&!m.settings.addPrecedence&&(R=1),D=m.selectable()[R]}}else d&&(D=d);e&&!m.isOpen&&(m.open(),m.scrollToOption(D,"auto")),m.setActiveOption(D)}else m.clearActiveOption(),e&&m.isOpen&&m.close(!1)}selectable(){return this.dropdown_content.querySelectorAll("[data-selectable]")}addOption(e,t=!1){let i=this;if(Array.isArray(e))return i.addOptions(e,t),!1;let r=Fe(e[i.settings.valueField]);return r===null||i.options.hasOwnProperty(r)?!1:(e.$order=e.$order||++i.order,e.$id=i.inputId+"-opt-"+e.$order,i.options[r]=e,i.lastQuery=null,t&&(i.userOptions[r]=t,i.trigger("option_add",r,e)),r)}addOptions(e,t=!1){ve(e,i=>{this.addOption(i,t)})}registerOption(e){return this.addOption(e)}registerOptionGroup(e){var t=Fe(e[this.settings.optgroupValueField]);return t===null?!1:(e.$order=e.$order||++this.order,this.optgroups[t]=e,t)}addOptionGroup(e,t){var i;t[this.settings.optgroupValueField]=e,(i=this.registerOptionGroup(t))&&this.trigger("optgroup_add",i,t)}removeOptionGroup(e){this.optgroups.hasOwnProperty(e)&&(delete this.optgroups[e],this.clearCache(),this.trigger("optgroup_remove",e))}clearOptionGroups(){this.optgroups={},this.clearCache(),this.trigger("optgroup_clear")}updateOption(e,t){let i=this;var r,o;let s=Fe(e),a=Fe(t[i.settings.valueField]);if(s===null)return;let l=i.options[s];if(l==null)return;if(typeof a!="string")throw new Error("Value must be set in option data");let c=i.getOption(s),u=i.getItem(s);if(t.$order=t.$order||l.$order,delete i.options[s],i.uncacheValue(a),i.options[a]=t,c){if(i.dropdown_content.contains(c)){let d=i._render("option",t);fi(c,d),i.activeOption===c&&i.setActiveOption(d)}c.remove()}u&&(o=i.items.indexOf(s),o!==-1&&i.items.splice(o,1,a),r=i._render("item",t),u.classList.contains("active")&&$e(r,"active"),fi(u,r)),i.lastQuery=null}removeOption(e,t){let i=this;e=ui(e),i.uncacheValue(e),delete i.userOptions[e],delete i.options[e],i.lastQuery=null,i.trigger("option_remove",e),i.removeItem(e,t)}clearOptions(e){let t=(e||this.clearFilter).bind(this);this.loadedSearches={},this.userOptions={},this.clearCache();let i={};ve(this.options,(r,o)=>{t(r,o)&&(i[o]=r)}),this.options=this.sifter.items=i,this.lastQuery=null,this.trigger("option_clear")}clearFilter(e,t){return this.items.indexOf(t)>=0}getOption(e,t=!1){let i=Fe(e);if(i===null)return null;let r=this.options[i];if(r!=null){if(r.$div)return r.$div;if(t)return this._render("option",r)}return null}getAdjacent(e,t,i="option"){var r=this,o;if(!e)return null;i=="item"?o=r.controlChildren():o=r.dropdown_content.querySelectorAll("[data-selectable]");for(let s=0;s0?o[s+1]:o[s-1];return null}getItem(e){if(typeof e=="object")return e;var t=Fe(e);return t!==null?this.control.querySelector(`[data-value="${zo(t)}"]`):null}addItems(e,t){var i=this,r=Array.isArray(e)?e:[e];r=r.filter(s=>i.items.indexOf(s)===-1);let o=r[r.length-1];r.forEach(s=>{i.isPending=s!==o,i.addItem(s,t)})}addItem(e,t){var i=t?[]:["change","dropdown_close"];Vo(this,i,()=>{var r,o;let s=this,a=s.settings.mode,l=Fe(e);if(!(l&&s.items.indexOf(l)!==-1&&(a==="single"&&s.close(),a==="single"||!s.settings.duplicates))&&!(l===null||!s.options.hasOwnProperty(l))&&(a==="single"&&s.clear(t),!(a==="multi"&&s.isFull()))){if(r=s._render("item",s.options[l]),s.control.contains(r)&&(r=r.cloneNode(!0)),o=s.isFull(),s.items.splice(s.caretPos,0,l),s.insertAtCaret(r),s.isSetup){if(!s.isPending&&s.settings.hideSelected){let c=s.getOption(l),u=s.getAdjacent(c,1);u&&s.setActiveOption(u)}s.settings.clearAfterSelect&&s.setTextboxValue(),!s.isPending&&!s.settings.closeAfterSelect&&s.refreshOptions(s.isFocused&&a!=="single"),s.settings.closeAfterSelect!=!1&&s.isFull()?s.close():s.isPending||s.positionDropdown(),s.trigger("item_add",l,r),s.isPending||s.updateOriginalInput({silent:t})}(!s.isPending||!o&&s.isFull())&&(s.inputState(),s.refreshState())}})}removeItem(e=null,t){let i=this;if(e=i.getItem(e),!e)return;var r,o;let s=e.dataset.value;r=qo(e),e.remove(),e.classList.contains("active")&&(o=i.activeItems.indexOf(e),i.activeItems.splice(o,1),gt(e,"active")),i.items.splice(r,1),i.lastQuery=null,!i.settings.persist&&i.userOptions.hasOwnProperty(s)&&i.removeOption(s,t),r{}){arguments.length===3&&(t=arguments[2]),typeof t!="function"&&(t=()=>{});var i=this,r=i.caretPos,o;if(e=e||i.inputValue(),!i.canCreate(e))return Fe(e)&&this.options[e]&&i.addItem(e),t(),!1;i.lock();var s=!1,a=l=>{if(i.unlock(),!l||typeof l!="object")return t();var c=Fe(l[i.settings.valueField]);if(typeof c!="string")return t();i.setTextboxValue(),i.addOption(l,!0),i.setCaret(r),i.addItem(c),t(l),s=!0};return typeof i.settings.create=="function"?o=i.settings.create.call(this,e,a):o={[i.settings.labelField]:e,[i.settings.valueField]:e},s||a(o),!0}refreshItems(){var e=this;e.lastQuery=null,e.isSetup&&e.addItems(e.items),e.updateOriginalInput(),e.refreshState()}refreshState(){let e=this;e.refreshValidityState();let t=e.isFull(),i=e.isLocked;e.wrapper.classList.toggle("rtl",e.rtl);let r=e.wrapper.classList;r.toggle("focus",e.isFocused),r.toggle("disabled",e.isDisabled),r.toggle("readonly",e.isReadOnly),r.toggle("required",e.isRequired),r.toggle("invalid",!e.isValid),r.toggle("locked",i),r.toggle("full",t),r.toggle("input-active",e.isFocused&&!e.isInputHidden),r.toggle("dropdown-active",e.isOpen),r.toggle("has-options",Za(e.options)),r.toggle("has-items",e.items.length>0)}refreshValidityState(){var e=this;e.input.validity&&(e.isValid=e.input.validity.valid,e.isInvalid=!e.isValid)}isFull(){return this.settings.maxItems!==null&&this.items.length>=this.settings.maxItems}updateOriginalInput(e={}){let t=this;var i,r;let o=t.input.querySelector('option[value=""]');if(t.is_select_tag){let l=function(c,u,d){return c||(c=nt('")),c!=o&&t.input.append(c),s.push(c),(c!=o||a>0)&&(c.selected=!0),c},s=[],a=t.input.querySelectorAll("option:checked").length;t.input.querySelectorAll("option:checked").forEach(c=>{c.selected=!1}),t.items.length==0&&t.settings.mode=="single"?l(o,"",""):t.items.forEach(c=>{if(i=t.options[c],r=i[t.settings.labelField]||"",s.includes(i.$option)){let u=t.input.querySelector(`option[value="${zo(c)}"]:not(:checked)`);l(u,c,r)}else i.$option=l(i.$option,c,r)})}else t.input.value=t.getValue();t.isSetup&&(e.silent||t.trigger("change",t.getValue()))}open(){var e=this;e.isLocked||e.isOpen||e.settings.mode==="multi"&&e.isFull()||(e.isOpen=!0,le(e.focus_node,{"aria-expanded":"true"}),e.refreshState(),di(e.dropdown,{visibility:"hidden",display:"block"}),e.positionDropdown(),di(e.dropdown,{visibility:"visible",display:"block"}),e.focus(),e.trigger("dropdown_open",e.dropdown))}close(e=!0){var t=this,i=t.isOpen;e&&(t.setTextboxValue(),t.settings.mode==="single"&&t.items.length&&t.inputState()),t.isOpen=!1,le(t.focus_node,{"aria-expanded":"false"}),di(t.dropdown,{display:"none"}),t.settings.hideSelected&&t.clearActiveOption(),t.refreshState(),i&&t.trigger("dropdown_close",t.dropdown)}positionDropdown(){if(this.settings.dropdownParent==="body"){var e=this.control,t=e.getBoundingClientRect(),i=e.offsetHeight+t.top+window.scrollY,r=t.left+window.scrollX;di(this.dropdown,{width:t.width+"px",top:i+"px",left:r+"px"})}}clear(e){var t=this;if(t.items.length){var i=t.controlChildren();ve(i,r=>{t.removeItem(r,!0)}),t.inputState(),e||t.updateOriginalInput(),t.trigger("clear")}}insertAtCaret(e){let t=this,i=t.caretPos,r=t.control;r.insertBefore(e,r.children[i]||null),t.setCaret(i+1)}deleteSelection(e){var t,i,r,o,s=this;t=e&&e.keyCode===8?-1:1,i=Ka(s.control_input);let a=[];if(s.activeItems.length)o=Wo(s.activeItems,t),r=qo(o),t>0&&r++,ve(s.activeItems,l=>a.push(l));else if((s.isFocused||s.settings.mode==="single")&&s.items.length){let l=s.controlChildren(),c;t<0&&i.start===0&&i.length===0?c=l[s.caretPos-1]:t>0&&i.start===s.inputValue().length&&(c=l[s.caretPos]),c!==void 0&&a.push(c)}if(!s.shouldDelete(a,e))return!1;for(fe(e,!0),typeof r!="undefined"&&s.setCaret(r);a.length;)s.removeItem(a.pop());return s.inputState(),s.positionDropdown(),s.refreshOptions(!1),!0}shouldDelete(e,t){let i=e.map(r=>r.dataset.value);return!(!i.length||typeof this.settings.onDelete=="function"&&this.settings.onDelete.call(this,i,t)===!1)}advanceSelection(e,t){var i,r,o=this;o.rtl&&(e*=-1),!o.inputValue().length&&(Mt(hi,t)||Mt("shiftKey",t)?(i=o.getLastActive(e),i?i.classList.contains("active")?r=o.getAdjacent(i,e,"item"):r=i:e>0?r=o.control_input.nextElementSibling:r=o.control_input.previousElementSibling,r&&(r.classList.contains("active")&&o.removeActiveItem(i),o.setActiveItemClass(r))):o.moveCaret(e))}moveCaret(e){}getLastActive(e){let t=this.control.querySelector(".last-active");if(t)return t;var i=this.control.querySelectorAll(".active");if(i)return Wo(i,e)}setCaret(e){this.caretPos=this.items.length}controlChildren(){return Array.from(this.control.querySelectorAll("[data-ts-item]"))}lock(){this.setLocked(!0)}unlock(){this.setLocked(!1)}setLocked(e=this.isReadOnly||this.isDisabled){this.isLocked=e,this.refreshState()}disable(){this.setDisabled(!0),this.close()}enable(){this.setDisabled(!1)}setDisabled(e){this.focus_node.tabIndex=e?-1:this.tabIndex,this.isDisabled=e,this.input.disabled=e,this.control_input.disabled=e,this.setLocked()}setReadOnly(e){this.isReadOnly=e,this.input.readOnly=e,this.control_input.readOnly=e,this.setLocked()}destroy(){var e=this,t=e.revertSettings;e.trigger("destroy"),e.off(),e.wrapper.remove(),e.dropdown.remove(),e.input.innerHTML=t.innerHTML,e.input.tabIndex=t.tabIndex,gt(e.input,"tomselected","ts-hidden-accessible"),e._destroy(),delete e.input.tomselect}render(e,t){var i,r;let o=this;if(typeof this.settings.render[e]!="function"||(r=o.settings.render[e].call(this,t,dr),!r))return null;if(r=nt(r),e==="option"||e==="option_create"?t[o.settings.disabledField]?le(r,{"aria-disabled":"true"}):le(r,{"data-selectable":""}):e==="optgroup"&&(i=t.group[o.settings.optgroupValueField],le(r,{"data-group":i}),t.group[o.settings.disabledField]&&le(r,{"data-disabled":""})),e==="option"||e==="item"){let s=ui(t[o.settings.valueField]);le(r,{"data-value":s}),e==="item"?($e(r,o.settings.itemClass),le(r,{"data-ts-item":""})):($e(r,o.settings.optionClass),le(r,{role:"option",id:t.$id}),t.$div=r,o.options[s]=t)}return r}_render(e,t){let i=this.render(e,t);if(i==null)throw"HTMLElement expected";return i}clearCache(){ve(this.options,e=>{e.$div&&(e.$div.remove(),delete e.$div)})}uncacheValue(e){let t=this.getOption(e);t&&t.remove()}canCreate(e){return this.settings.create&&e.length>0&&this.settings.createFilter.call(this,e)}hook(e,t,i){var r=this,o=r[t];r[t]=function(){var s,a;return e==="after"&&(s=o.apply(r,arguments)),a=i.apply(r,arguments),e==="instead"?a:(e==="before"&&(s=o.apply(r,arguments)),s)}}};var Am=(n,e,t,i)=>{n.addEventListener(e,t,i)};function ol(){Am(this.input,"change",()=>{this.sync()})}var Sm=n=>typeof n=="undefined"||n===null?null:Dm(n),Dm=n=>typeof n=="boolean"?n?"1":"0":n+"",sl=(n,e=!1)=>{n&&(n.preventDefault(),e&&n.stopPropagation())},Om=n=>{if(n.jquery)return n[0];if(n instanceof HTMLElement)return n;if(Lm(n)){var e=document.createElement("template");return e.innerHTML=n.trim(),e.content.firstChild}return document.querySelector(n)},Lm=n=>typeof n=="string"&&n.indexOf("<")>-1;function al(n){var e=this,t=e.onOptionSelect;e.settings.hideSelected=!1;let i=Object.assign({className:"tomselect-checkbox",checkedClassNames:void 0,uncheckedClassNames:void 0},n);var r=function(a,l){l?(a.checked=!0,i.uncheckedClassNames&&a.classList.remove(...i.uncheckedClassNames),i.checkedClassNames&&a.classList.add(...i.checkedClassNames)):(a.checked=!1,i.checkedClassNames&&a.classList.remove(...i.checkedClassNames),i.uncheckedClassNames&&a.classList.add(...i.uncheckedClassNames))},o=function(a){setTimeout(()=>{var l=a.querySelector("input."+i.className);l instanceof HTMLInputElement&&r(l,a.classList.contains("selected"))},1)};e.hook("after","setupTemplates",()=>{var s=e.settings.render.option;e.settings.render.option=(a,l)=>{var c=Om(s.call(e,a,l)),u=document.createElement("input");i.className&&u.classList.add(i.className),u.addEventListener("click",function(p){sl(p)}),u.type="checkbox";let d=Sm(a[e.settings.valueField]);return r(u,!!(d&&e.items.indexOf(d)>-1)),c.prepend(u),c}}),e.on("item_remove",s=>{var a=e.getOption(s);a&&(a.classList.remove("selected"),o(a))}),e.on("item_add",s=>{var a=e.getOption(s);a&&o(a)}),e.hook("instead","onOptionSelect",(s,a)=>{if(a.classList.contains("selected")){a.classList.remove("selected"),e.removeItem(a.dataset.value),e.refreshOptions(),sl(s,!0);return}t.call(e,s,a),o(a)})}var Mm=n=>{if(n.jquery)return n[0];if(n instanceof HTMLElement)return n;if(Nm(n)){var e=document.createElement("template");return e.innerHTML=n.trim(),e.content.firstChild}return document.querySelector(n)},Nm=n=>typeof n=="string"&&n.indexOf("<")>-1;function ll(n){let e=this,t=Object.assign({className:"clear-button",title:"Clear All",role:"button",tabindex:0,html:i=>`
    ×
    `},n);e.on("initialize",()=>{var i=Mm(t.html(t));i.addEventListener("click",r=>{e.isLocked||(e.clear(),e.settings.mode==="single"&&e.settings.allowEmptyOption&&e.addItem(""),e.refreshOptions(!1),r.preventDefault(),r.stopPropagation())}),e.control.appendChild(i)})}var km=(n,e=!1)=>{n&&(n.preventDefault(),e&&n.stopPropagation())},On=(n,e,t,i)=>{n.addEventListener(e,t,i)},Hm=(n,e)=>{if(Array.isArray(n))n.forEach(e);else for(var t in n)n.hasOwnProperty(t)&&e(n[t],t)},Rm=n=>{if(n.jquery)return n[0];if(n instanceof HTMLElement)return n;if(Im(n)){var e=document.createElement("template");return e.innerHTML=n.trim(),e.content.firstChild}return document.querySelector(n)},Im=n=>typeof n=="string"&&n.indexOf("<")>-1,Pm=(n,e)=>{Hm(e,(t,i)=>{t==null?n.removeAttribute(i):n.setAttribute(i,""+t)})},Fm=(n,e)=>{var t;(t=n.parentNode)==null||t.insertBefore(e,n.nextSibling)},$m=(n,e)=>{var t;(t=n.parentNode)==null||t.insertBefore(e,n)},Bm=(n,e)=>{do{var t;if(e=(t=e)==null?void 0:t.previousElementSibling,n==e)return!0}while(e&&e.previousElementSibling);return!1};function cl(){var n=this;if(n.settings.mode!=="multi")return;var e=n.lock,t=n.unlock;let i=!0,r;n.hook("after","setupTemplates",()=>{var o=n.settings.render.item;n.settings.render.item=(s,a)=>{let l=Rm(o.call(n,s,a));Pm(l,{draggable:"true"});let c=v=>{i||km(v),v.stopPropagation()},u=v=>{r=l,setTimeout(()=>{l.classList.add("ts-dragging")},0)},d=v=>{v.preventDefault(),l.classList.add("ts-drag-over"),y(l,r)},p=()=>{l.classList.remove("ts-drag-over")},y=(v,_)=>{_!==void 0&&(Bm(_,l)?Fm(v,_):$m(v,_))},m=()=>{var v;document.querySelectorAll(".ts-drag-over").forEach(C=>C.classList.remove("ts-drag-over")),(v=r)==null||v.classList.remove("ts-dragging"),r=void 0;var _=[];n.control.querySelectorAll("[data-value]").forEach(C=>{if(C.dataset.value){let D=C.dataset.value;D&&_.push(D)}}),n.setValue(_)};return On(l,"mousedown",c),On(l,"dragstart",u),On(l,"dragenter",d),On(l,"dragover",d),On(l,"dragleave",p),On(l,"dragend",m),l}}),n.hook("instead","lock",()=>(i=!1,e.call(n))),n.hook("instead","unlock",()=>(i=!0,t.call(n)))}var Vm=(n,e=!1)=>{n&&(n.preventDefault(),e&&n.stopPropagation())},zm=n=>{if(n.jquery)return n[0];if(n instanceof HTMLElement)return n;if(jm(n)){var e=document.createElement("template");return e.innerHTML=n.trim(),e.content.firstChild}return document.querySelector(n)},jm=n=>typeof n=="string"&&n.indexOf("<")>-1;function ul(n){let e=this,t=Object.assign({title:"Untitled",headerClass:"dropdown-header",titleRowClass:"dropdown-header-title",labelClass:"dropdown-header-label",closeClass:"dropdown-header-close",html:i=>'
    '},n);e.on("initialize",()=>{var i=zm(t.html(t)),r=i.querySelector("."+t.closeClass);r&&r.addEventListener("click",o=>{Vm(o,!0),e.close()}),e.dropdown.insertBefore(i,e.dropdown.firstChild)})}var Wm=(n,e)=>{if(Array.isArray(n))n.forEach(e);else for(var t in n)n.hasOwnProperty(t)&&e(n[t],t)},qm=(n,...e)=>{var t=Um(e);n=Ym(n),n.map(i=>{t.map(r=>{i.classList.remove(r)})})},Um=n=>{var e=[];return Wm(n,t=>{typeof t=="string"&&(t=t.trim().split(/[\t\n\f\r\s]/)),Array.isArray(t)&&(e=e.concat(t))}),e.filter(Boolean)},Ym=n=>(Array.isArray(n)||(n=[n]),n),Gm=(n,e)=>{if(!n)return-1;e=e||n.nodeName;for(var t=0;n=n.previousElementSibling;)n.matches(e)&&t++;return t};function dl(){var n=this;n.hook("instead","setCaret",e=>{n.settings.mode==="single"||!n.control.contains(n.control_input)?e=n.items.length:(e=Math.max(0,Math.min(n.items.length,e)),e!=n.caretPos&&!n.isPending&&n.controlChildren().forEach((t,i)=>{i{if(!n.isFocused)return;let t=n.getLastActive(e);if(t){let i=Gm(t);n.setCaret(e>0?i+1:i),n.setActiveItem(),qm(t,"last-active")}else n.setCaret(n.caretPos+e)})}var Km=(n,e=!1)=>{n&&(n.preventDefault(),e&&n.stopPropagation())},Xm=(n,e,t,i)=>{n.addEventListener(e,t,i)},Qm=(n,e)=>{if(Array.isArray(n))n.forEach(e);else for(var t in n)n.hasOwnProperty(t)&&e(n[t],t)},fl=n=>{if(n.jquery)return n[0];if(n instanceof HTMLElement)return n;if(Jm(n)){var e=document.createElement("template");return e.innerHTML=n.trim(),e.content.firstChild}return document.querySelector(n)},Jm=n=>typeof n=="string"&&n.indexOf("<")>-1,Zm=(n,...e)=>{var t=eg(e);n=tg(n),n.map(i=>{t.map(r=>{i.classList.add(r)})})},eg=n=>{var e=[];return Qm(n,t=>{typeof t=="string"&&(t=t.trim().split(/[\t\n\f\r\s]/)),Array.isArray(t)&&(e=e.concat(t))}),e.filter(Boolean)},tg=n=>(Array.isArray(n)||(n=[n]),n);function hl(){let n=this;n.settings.shouldOpen=!0,n.hook("before","setup",()=>{var e;n.focus_node=n.control,Zm(n.control_input,"dropdown-input");let t=fl('

    @DpC6 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 delta 73468 zcmXWkcfgKSAHeb3^UzRsBn>NjW)>MCJ9{R3Wo1Pr+?3Ijik4IwN<))2>6HeeAx-U) zmXtJ9@ArG3-}}$!I_EmqIlnWn>v_<-drOJSUoDZ{Q?lUl4F9{RNG5XV>Nsa3**0d8XjGtK;}$rj$QC#9FCiDG*+!xAX5sj!J>E< z(o8nO=a*pxCdZ{tytRzaXL1}hp{Dofeo=@tpb^j z*cS)k9oQNF!uoi2?bMN(;Ujn&`Co-)>ZE!**2$)exnwv3Pob-OPk2P#lwUU-fNi*c z8M@kE!77+nFEv;l9rB^*8W@j9<1};;&&GVb3|-`lvQgl=@K&^fdm_Cy($Ao){(tD4 zzlNppLp%ldqf=F^et`@-Ia3B*bf=;XorVU~Ebh0#Vx+S@;$m1h1$|&1TH%#wg-gRb z(8cyJTH!P3(7uG0KY;e|PqdzY(C3dhE$#o~(C4csvzbO*xJ_E4J?oB+z;HCeiC7V5 zqYvJJmVXfK;j`%e--4F^Ant#MuAM*7`sy}F0i6-H$;tlf!i5F;pxbLGTG5oqpNID3 zYV-tK7CsR7UqGLG72THaqk;X5cIYq~c+rNbopR{?DpB7O-Sp?z2r|3pXV)JDmscn0atn03D|;G!NrkEXxJ+E}S^ zn&a+hh5gY$#-M@CL@S<;2CxjBs@u>&Ux@te=q`8%eeM$+f_odY|IO&oBsJ6v9kO%L zMKlrZ=@c~LORzFNiKpUj^gud{EwE|R^!yC;yjYAjyagT6ooGkCLIeM`Df_=Q7e}0) z&hifE6pX?fa0=dq`Ddgf`Chc5XT$AiMW2Vi;Y!j+HY<=hxd87H>_z&2&C^L)=FGH9 zCZHoWEz5;Hyciw&`RKv&Or#H@M{n&G>Bt?0$CJJno$D8{Dt?2GP?45tlduaK=`i#F8iTIh2{;um#*VlTecv~1T_AHV zE=PxcKf3?_3XeJ~<(EOGqFJT_7Z#|8R@@>AbVlETeb5mahc3QpXb&#C@$sWdWzBg$ zN^T85L*E_;(HiTvNweM@O?O6H?2nGg=(v9gI{8c{8DZ2cB3y)}*4u-N=iTnm=0DaNt zCbr9_p3El09$keK@Rlf0@a!~J$6*8V>!AB>7<%GNKzqCpt?+uRf~z9^YPcI6sc+He z|HiZMh-~|m(Gi{P-sngSMki?^x<3}8LwXBZ(b~BGa^!!6mir~r1v{j2<5-GCKF~ zM*i1m2meUvZ05*L>A`a7hO88JMUSwVXhXAbD9%Th^XKTk+86Fed-yvV=-+6$qdTXL zlthoZlh6+I$AW&oPUOM{rlJpC94?CdWoSh!B7HBmBK=VKJ=)`1UD9fAiT1n;y4VIs z`a(3|Md(ysgU9&#x|<6dUTX%vfDZj@k$yYegYJrbSRRkBY0-FWLxxpXLRl_ zM@MiOx<*!_yWqZV@%nl!3OtWiv>6?Nt=Ir}p|7W-x);dQ!uIIr?lko5U5h<&8@9$% zdZa^rC^jU$2;G*?q36J7VSZ2czpK7#&s1<6+Tcp`{kRh^!h`6pnA9tMC%=OANEh#& zzL8pEU(z#iAa29nShY_Yp;>6aPh&Uy6%DLSwr~7ofOW}Oi`DRxuu#8r($zr&8--SU zGg`s-=+Kt$pQf%lx)vItBX|}%qFvA-?}Z*zgV9}(oy3K2`peL{*@Qm$I+ntBun~S6 z_fHy-R`;psB5D%pcIbPxANn4>03D$R&~opi^?iel@h>EhY^MIe)NpIGM;+0Ev(bo` zqKk9|+Ot*Yc3T_iO=!SxqKoZ)w1?k?f1(G@(dVY;%c22Q!DHP24Y{aFMk}-jV{jPG z#ZmYv`jTolD4ld8(IMZ6j@WBxpgY5l&~5fj+&}8Pw0nwUZSv1Tr{n@W()~Y!3nQ9? z_VDUR--1TI8f{=5Ix;VzbN4R#+;`}R9E$wHgVVMxkG`Z%$M)C@t^Zc^fLe`NU#HJ- zVa4yDJ^L0N^8MlO=nx+cj~J2yD~^s>d9;D1=!rKMeSSIm+zPbe`_K`4BGS(dVgK8M zSIMxayW+-IX#OwZe`pVj3{5?+fR=BJR@@HlQBSlZBhlwCLOZk&ZFmV9*iGn&-aa&& z7Tx`1xN1K_3zi<1Dm)o|pdPxK8)GjVjeev(gO)EfJT-J8x(H82PtwL{pl6{UEIrVU zEROu!vRpVsYr-ed)%zk^(e}vSgUanm@xrel{3)?=Ad(V4LZm7pn*LfZVf*|1N|O-s~wK~lA}_wxT2TF_y;z=%-i7^HYPzV;#~p(B0D?eSR<+ z=qR+_OU`Hi+u$NHY;XxS#oN&#dl#MCFVV<N6Q^TKOzf`Pv=1^^zAtr8{=B^UGWt< z^!XD~;HA+9PeH!}>Y(+H%W~n+U4#zRY|O*UFn4mr{UwpUF}xkE@ILgpr_i1~7j8mF z?lp9Z-$6U_N%$RFfA%032JkOhFn?kySOo3y36ZXf^+`8C%Z)?>n1oevHrl{Fk$x2Y z27E8_i%m*v=R|bT*2e1Y|5jWyAme;I4OifaxE&p$@4`c9poK0-4HZUvSSGB9?Mc_h zMmQb)IDG*9cKjM0smhbnBCml(-T$X?;l6DhH+rC}d_Xu3UFEaT#dI6y)(YD5*U-8C z8GWw6lvJ)HTCO^}{aT~n1$`nt6YIPGuj0ZXc^>QGn`qDf#q;slsVTr2=;B(4e#PF4 z&f%+gHtt0Cb(v{tE%ZP;)*szvW6=O7qhHPQFzbVNaN+9x3M*i_>B;8k5T6&0Mdy4P zI+XL#3KxgBple_aw!?Ke8vly?VHc*rCZgr0Ul{NIEE)FX+VG|*a3?yn521_k#Yn$_ z_UvP{q95Y^A80^@W~BTw=tx$IbbYj*GtrK9n!)~W%|)LmupFn7UWHCYshR14wqXx+ zE(fCxPsLMl4*GkwyCZ)K8pzw|)P9M+O@EL3MJ`JBPsnm%g*DNFEiv~a7uxgjXvDM8 zo?M9|@Md%y{)NtM!Hd(7AB*;^C%X8~!}@q(|LNDOiH`@Co#&eHQK5L3AYlMLTrNY&**StHy;l z8lVrhLJy?&Xv3FaM_h~^EIZNNQfN;4VYE3qbz`v~&cf61EzFJR+_YPcMGvHsXu#bu z_v`CETsUVV&<7@=LpKvE;9T@G{Z6cf&!OeNLAT*Ak$(t%IaOv+x5pva3-3c0;~(gn zI(lAO8z*AcRoRdW50uV094Dax>_A6gH~LomI{XW5sM!4UE1J&e)O14wIv1UyVdz?z zjQw#9cE$pirN!IzGWNemYCkd@+KFgGtIz<}ha1q5*@EkE2Rg(HFHb);KaImke}mT3 zVL@^>HX;2uI`n(dfT}D^+kWUmhNKM{cac#Szr+i%5>qWX5I>hZG z-4&gp0qA)!1`S{eR>dpvTzm`-=$I>0K&8-nv*oxj@+#<@HA9cqPUxZ;80qn7xmjp~ z*F}0I`rH%fbDP4q&>nt{*7Gm=T(PTC`IE7>`@c39MluksU=+GaFGLsBqPTxU++T?f z;Unmj{0}YnA-b);LD$Onk^dVy1(~Z;AV;E8Ru+$R|JUcjAw3-}*fI*79qGYng`>hr zXhSox4ql1|yaw&z^XSR>IvUs~X#L;C{hzTW>3=Zy$Jf=bNe50twBj-7kWN77bQW6C zg2-PQ`FA2im|24^-uKWz3tgM?i=quTNAI77^>7Nd!@Drso{O)!xDsnGiEW3j`VDA> zzoI=njGlBwuS-)_5j{6*qZM~YzxlFgz|WxNH=~PuH#))x(UCfQ9sA!13olI-7DpdE zG1Ar0HPHYa(l&9wA6mf(bX8A5NA6;DEzLnk?uzgRJc0D>=-OG2c5K^H_P-76BEzBl z8cmnHKAmip(1@!>x(<#feHyyWZjbxxBK-o|p)YyzC9>fg{n# zi=Z!~vSAf;`!qnOpe-7CU$p!X^es0I``~?O&;LRLFL+~W_!zX_;%Gf5qXA~?MSydR@e_B}fH|Hb{2m!)l62YEi5X~%^R z_Cw!tW6<~We6$BE(VpIm9zc(xL%A94!Ru(bU1(q*qk$ek1I#Q>JuexSM+2^nx!?bv z&4okOIhVn=AXXtg5Un_i4R8_W%5ngf{R`q>J1V0ihkKfv$z-=yToC zb7Al;?0@HU3K=%AFkFT{cn@0fy2yVe^52d0H)ucyu^Q&xnqJE_(R#a}KQRqM%Vn_< zUW3-Z=~ni?Uo!8IQ5B2cmcH#8V++y~&^53I@5RT^iu$fd+ja!HOU_3tyafH8xEg)# z&B)({4*9oeK)+%IESbGM6>Nw`+zcIw?r6`4pbcIS_b)|M%))0<9X<6y#f7%S{dng(Q==nYvUVq1inX4zQgE| zoOeeGyf8ZV$D`Y`7FzzSWH!@_3x{qb8qtg>uprXQu) z>F>`q!+PW|LIYZlj^qY(v2VrP&;Pr)Fru%}IXV~?xGObO1WzNsGB(7%SR1dzI=CL| z<5%daF1;#^Ty?bP4bcvEKu3BYx(G+8`~PMx?9nzn6~DlWc;wybPef~A1=78-7G8+X z@m=Vu--!O?^DX9nvbiVyHMMG3mHfNI*U@_SV+AaEFZKDYIr2t;APknSBGC?H`1rBPCtN5$4;c5Lr=#oDW5}?M3LWc>)daRdmkxql>n}gUSBr!L|gQs!iAq4?LJn zi=pX5X^zf97h!L7?na;u%tW`>)!_MkEQ#i(fgIr*LOX%=bh0-IwtZL zq9b}2`q};z(vfUtD;FL(JJFsV@pu~QqUgw+g3fhq^k^N64e>#ATkS!oVm}(-U+4%G zdLrE~jHXXQN3bGVt{NWe_kRN}Tr927{W}w__{vDHKp$9(o_x=uBlHs5^UY|WJJIL& zU_1N;ZLrCcsoa_9a~&~v;$rUmzi(s=GlK%-(26fa7uP(rhu6manw1P2cKo`XQOCr4x9nz)fc3U3l zSHd^Ym(C9K`5(~Ta|rFok?Yb3lvv09_Xmb@WY}PD^npQWAY;()_K8>?7oiobMtk-c zj=~LC0V}Uh=RiBOo=NCpyciwwW$1G&(SROW&;GaI^JM52tc`D>tMy;(h$Wv+i*67a zz;)x~k}6&DP?=w_i)Fh27C3@=~mc52I)G zZghl>doB%K`LG_^lUC@i>57ir5UhgJ(75gy@TJevO z{tFHC=;u=a<4S0iHzzS(jshv z7HEal@Emj-&Ondg>##MxjW$qfV+!O1tWEk9tbtw7`!mpvT#9yN5gO378`=L3)vZzB z!ML#w9m-8;Aa8~r$NhcicKRJHcg#zvfwJfbRYn_Vh~9671F>u5uSVN_;-zd_ME@hh zhIXSv|26vHkLcX}g-+42o02D@LtGOr-w3VnO!PoI2VL!p@LaqVU8KLE0TzBajbynj z7gjtNo8v@u(L8_?aVs{!)Bl$~8Yf^q(syAk+=-{*VRXprZcYc)0Q8gY8my0-u?`-@ zepvaH)LwQL7rsu{V{6=pK2U2*8j6_4=-HVRMQ|R}=3up&- zqa*SSx@iAIMkJg0mkZxc$Gw_{s5ZK<+n|fC9~$5kbPn%DEB+S^^n}+^1D(;;JrI3< z3c3aspn)$%+gXVQv@R#_|IJ(&`8#OAFVR)IAMN??m|Fwr5q<3IDbUjB8mNV??#5wj zbd`5Od)f>0uz%b?7Y$%E7N`Bpg(k#zLpdHBk)DH& z#1m-6U!o&$09|xPY)$zmp^Lm0y2j4HtlQ{3E*$Eq=z~|IBXTDiz@uozFNHhMq1+Sq ze@7cSa$9;$pN!6R3v>i}pbhs$M`|Qm-v!&)|K6Ar1+ETnMd$ARNI!`_xCyOr8#+~Q zp$+Xp1OFw`g|?>v%cAwyN2jVKcEXP6?|^RD&i=2<#Y1E`XCI;se;(-{(F%S;BhGs> zSpqFr0li;4(#^v5Xn?)Y=Z1zCpxbl~`eAZ^mJ2KTAG)u1pmX^j`e6MXsiIbBx+^+& zgV1d@7d*cr1wa^a#oeP@Bp7(5rd;wChZqHm@5 ze=GDLnvG}Rqc{@3LjyYJ?ew$Y6m*InMMvf-G|-pPDR={2Q|}^Em(6_5h2M66pn;Tq zr$Fvot{FP#gRm`*2_Hmz^b@*x528IU{B9blQt15(=r*nv={o2LHbO_DEf)9tzdIMs z)v&lRDZB&?Y#~;_`y#ysE&mM~;IC+f|AvKkr5=|-133jPR|VZw_0fP^VyTZcBZ2_53s!nebZ(KYc6IyL(u{WE4Al3%&7qP+Lg z5ETtiMkB9{2GA7UW}VT7hQ$5z(Ez4LdKNnO3(@Cp3|FI5_H5jL^F8*zL;Nur)$uSo zL{)aD1F12(O}e9NV*>iC)@!jcK7_S#2UfwuVWs!e{_lt$Y{PIm&O%4{C-lVq`~7(T z7x^F!bw%_fYY=usUp7O~ReuROQct3RZbW;u1AX~?g=gX4k#6x}8i_vWRE|JLWIFo% zqAV9ya1&a=L)Z#m#&($ZQL+O%q}QMi-WKTx(F&hI>)DD1_!(N?59mpk|8eppv_p;2 za@ihSI7H`RRh)?q(MojRK8O~40u5k8doT#O~%|2K1Cgb#*~qTA~!G|~;|fw2Xhf*oi@pP&K!h;GYcK2PcL=<_Wi z-2vStqtOw%0S)j2%aY4P<$EM|gku7&`RNhA*KV zdo}KF!>XirMgHM0;{9LX%QQE|&>mHcbStzcJ<*XEgbw{kbjrq|0bPi0+d1gsy%Ak> zcVSO_8(m|kewB7hV>Hl?Uu9E;-O2Dk=!;f77F`3=&O%Cn*^yp|cJNws5#EA~Og8f=7xv@_bXESFZe&XDP5G73{6=U`x}X8~M^Cm1 z=sRKoI>dLO2h(~qfURgi?}i`8{jV_h`@cWAuqQ`+mwt9DjXu~7U3~q~hKHk5H7V}T z4Hu&$w-lX0b07241Pk$xJjX9L=S9q4l(p@HqitiPxGiwlSJ`0rD}T4+U0u>-b8x7`x7p=D@= zE6~^O{gJ;N4e;G?58B{fT!07BkIz{@q!FI;1N+~(T||Zl%*wd23SBG@q6f&jNI!=L z_6j;h@5cR4(1yQ21N#9D^pEgAw7w&LOjA?>Eno3R_P;l3MMe`e-8$@oHrNlH+tJt! zXP^~qj{9$-L;VR_?x#rqi|3Lq_EX9qk0VIW!iJX5a#4$m548CbJ?Y7KF%~$OdOi!Scp=)*GPDEtqeH$H?Z__lW%fBbLjR!+ANzZ%zZ~ZN z{a;-!>T;tQ*28gVg}0&+--TB67`p1;L@U~jer$e?maBFs4RKTSyf_PMU_Z3JdFUEi zjGl|1p1 z51|bg_%odwNB_zGH-LI%c%vEmK$}SS3eQD*JOW+CQ_u=$paEpj2Ct6$*Q0ZO6B^iq z=<`owGkgWxVdk%R|DXL=>Twse;)~J1E<*#mHe8N2xDws(YtWa@bCJI@@;{FJA0t2i z?=)h?uny&GqXD0r<-+YT4DH#dNRLAsm=w;9``2M^(V>CdkM{6Mw1+Q6`pvli5!NLC z+py%})WH_$NM}26VMG1V3eLwWI5X0>qa*PkTG2XmF@1*i;9GRge?-gu9v1i~rH@5l z)5oLF)kgzwiX33sOxtvk8H(JlMCnM6LepHhgI>2yu93^tbn z#=nSa1sZ3x_j{EA=-hxXgm8OUFc}bvHyy2VGoW+E2xgXJnG?T z*cJ_723qkfwBiM5`5Vw(b1T-t^=N}%#r+@9^1q^UU!ZUrffAVS{y&)u=ddEWxT>KK zG(rPugGSyDUCk5FcgD;}&%&Oh7oq{}M(f#wF6!^mk@_d{k3A-h;0c(uXSKP|)6m7! z1P!1Sw!?GKGyDd01Rg?rxDIXbMRZO#qtETcTmYC00PV;>algc|>3;cR+5Z-(O@;+p zq80SQDmW}$gt($3_eHZF4d@p<4a=3v%Y8L>#oDA7 z;!1o1>tc`N@^XKXIh*Ce2>0P~tX(=4cp00M{sqfpoib@e&Os}fi2mHa0&VymbiW_Q zN?7~&^b+ch-k%rgHE4hzVoUe`v1RizL&@lZ{qP|if_W$8<^Gcj!?8Z;r_qM@Vk11h zTpGEqSd(-XYv6-e5#Pnu_&d^2rs;`!xsTYHX#R6p(f$877nR94`J@#2S!jf#(1312 z=k7 zpW|q3UokKDYq*EehW|pRqEV&vAu$EdC;b@uWpqO2yxa%LY3Q!G4_#ziu{HKOH81yP z$v2`?k*Sh)OAXB0(=)knh%Z1RzZ2(U*{W&iZbOIm18k4^)zX2}86Bb9u{-{XeX(uz zyxiZGy%l?qZdoJUzYaYqKgAR9a1HjqXMUNQX~-Ml+ycCeunGBJ*GeBEC)Li&TtK=l zw!tUR#di?T!a8-*+)l=Bq@Tobm{&J#%ZX?^7o*$tCiEOxQJ4Mi!EzrNj=&>W2=|~z z?N{iT{d1)Mi~EJ^y@_!D0MSFAzdt-ryX&d&%I;3Ag*T%2t+NjkiofnhPU3522 z!#!BX{ok{38p13Z$kkW_Z$gLoCA6onq9e5%?ZJ2GnmM^i`m*U3jz(AaZ1hv@CUnXk z#tQfZdVsxy)!hF_HBH;1K9(VU4mtv((1tFh%mt@%R0W_feW~o4NbjT~94>mw6YKi_F-w}Q8 za{LpQp#d&wo`(Ep^tqL2U~6zLZo)ileJ1ACrxYsc28oDe8!>ts!W`Ga^4bj|&^T2|dg2M(6fVw1J|nQUm4D2F^e$ z?1@%5Hqvv^=a!+XeGNL5kD?uW0bO)&q9gEe%Fkwg;Gz^6|DruE**Xnrx$u;*5;_7^ z(GjSJPQe-I^DWVy^+E$599|G+u^#zL(EwkbL=70hp&zIImqw^I=KlR}3oa^iqYwJv z#pqluMPEX9pbbBcu9Yol#c!iS{Y9jIMa$)%ojx?mqHE+Vv||I%=cb~8%s-p`?*liJ zQ2`%DSMzo}5x+$P%5R?nIT34;t{V=-CZrdj6+e&Gw-s&pGpvt?(04=i4rw>_L+_97 zkWE89n+%710anLrqTo7o1U5(hZgjtAI;MsSqH})&TJ8+=t94 z(GmF}%Y}=fP^Wa%77a^d1@ccqhr9*O#7_7IzJ#yi)t%E9QQt0Ub>D(6=GV|weh7X3 zpGY6wHH}Cybc(aBxp47yLjxIrF1q1pk1jyB*ZfE?M<0A3T#p`5o6)uKPUL?T9>8+s zXU@sX{Wbp+(W&i;)RWCj;=T?;p%J$Vdmczw7TeeP{^NPPVAm4tcnIwC(>u2BheZStT!6aAavx0qt8!3 z1DT1In}v?dWoUiZqa(Z$9nsZzlKcNTE?hLb(banp?P=j2se!WSgO$*VYoQG`L>p*{ zE~azPZ8ZiBcsAP5b?6a%4?0EbBE1E(-guu2x6eLwNdH0uD9|%CTnz1LS+s&m=o)E= zjzsIQJzB0S8el)P=flx^_qk6Ibtza4%J}^ISEI}W*9qr+L=z|YM{*!1= zUO;=i0}c2Cv}a$T^?r{YG=HHTE73cRbdB(gEEf)Gr^q-r(&NzvE=2=dg3j#H zp1p?7@q6eQzYkqYNA^i0Q3aiXW@rc6qxE(}pUV#C!ir{~5nqlrcthmhiH^i0;d->9 zjcDMnqUGO5d-yfF82>@*Ez>sza4K4^K00D8kP*vfI&k6ZvRB;bpKfG^M|vXKgPCXr zm&N_-BLB82_1>s(EuMB!2b7Q9T^VoMl^tJXa&0? z{Uy3ue?q4wZ(zEAJo;Saus+&Q3p9|nXnkGL5$=x$Fa({NNdwvc7MKUO@wYEBq+(zYc#vx7j~v;Kk2P?VO4RRu2v2^eh(^=z#WY5W0<~phJEI zI@GJspI9D88-6O>fCl_pxC;&N3$&r1&^2@@EHo&ML@D&SY&kA0SPfl7^`k%|bcmXx z0klRd>VcLU68A@-Lp~M_Y!Vv4MQ8(;NB&Z@o!iib!dZ|(FR^e%fE{*#?R6EenUHO)DZT+7iGAxqEpcT8ln%jLVMUX z^7}>p2(2_1>;L)ia5@GcqpDZ1_Up^^TL_O#g0 z6xi`-er2?$P0;|)M4xYucAzKP@ZfMHTJJct{48{BEf|_j8P}3wWH+Px{oW|BKJquB z4{k#%dJk>zTg)v&^!b0$*Yq*N(otIx9pTf_a_!M_z0l`}X1TCOnKxskpm(zjyn&;Rb{!Ui74diV_1$GzA9PZ*i* zcSS4ejZVpMG@vPwe{rN2q4h0^{N?CK+!Oh0(GgpR1>OH!qQF*k?%zXu@`VL(Z}?;6 zA3%HdN2CjlN`V~{o`42cEz;gY|DpjOH6|^_6VT@>p@CKpYoR~&){Xm}(dT+(BV#xkz*uzOPY%8BgV&+o_Ya{x zd<_lg6SSgV(QmtgW7GG;iD-`-q8(_B*4qs&KLl+rJ2@^cLbp>E9oj3-7{e=Uu_=NQ9yYV=j^b2^p-~XpfOn+d| zA3Jd4I&6)*(IGE8DcKk+lkSD5;!JFgD{w6C#@5*Cg1pQKoQIwtUxsBSr$ycg?PwpY z;Qn92MH_q+Psan;6KhRLzp?TZq1tZV4X@U%<-bzj+b+-#I!EH>zBm9%zd0?@s8C)4kCiPemJ8i1zeB zw1J)B7vXPc14mqv?$->@M4#^#PS0}T9NvO%o0rj_&EARhk7xt`;s;oKR{EpWeK?i$ zb(f~UA5>s=n&S~Tg#1Tw5Eh-27TtJs7tFwJxC3*$<&?Q;ZZE+bxlw=-xf7S;3~W3v z!*QgGEJ%y{BBZ`-=5;O> zaiiqI^c&7wu|MhJi_)SzAC2@WY=y-Z=jHwlXLmfC^sU$(KScwqcSYJw7o*$kc{KkZ z8gR=i(;swPis!oQ-{ztYH|kuKdNv51io5Yhd=gy?&!emN6?D;V#iMWsTJHTD&zf8+ z_dY#Lj%Qurt5eCc=%k*6)v-zB4@J+?k?3-rg8tBVdF0=Y9@=Z-{NB686ArBK-+EGKa%r*QInNG?2!a zdmiohq-@-ngMOslhz`-+Xu&toA^ZV7L5^CQPM(v|09v9I4MrQ7gw}I8`rHj@Kx@&L z!zQ%+9&|*rKXKuMCtaUzG(daaCenk@A)bJ)s!OmQUXGqLPhwkq3w^Hi4XNR}=yL8H zE(kZEFONS`I-6;JV_H-*(1V7#)30*j2)u=(@LO~PcU_(~_Wjt0^na1=b5pADVe~DuG1AA}oTls)beFV7 z_vJY_9EYHRzk~+#DQ@oQ-j$hu*Wg&v|Dtm{=FXJA06mgE zh;*g9QUe#EN8em@1m8p77C&GOEU_y6aaZ$jTDS%+_t`4;zZZq>PLb9`=eQ|a;aNBf z`(t-}8-0sZx+fj>%g~+{zBjF%5@8*5h&!S6oEQ1i!X@bLdhlNMzZcucu;HK32mgqI z$K03F)zBeqhAz&|=yM~{xn78l&<*I%P9LG=zlrqkcns+RtJCvEupH^CSuQ-3&%)EN zGg`rHbj}xttI-NyK@X~3XrM>jpL%`*HX+>@>*2)kc66U_!$J5LdcO2~Aax)+mkS%Z z3mvMB=#=b2SNC6$ZoekopMVB3KfE5Dl2vFxr5;QbSH%IOJEBvx3a$5nNN-2#$!6Z= z!Z-X^DI?SHq0~TI^gQT|1~wUo;X<^+Z_q$~jPyU~)D(O;P07h&O|)E7^nQoPAC{B- zHz_h^p#>MC4cr{wf%fb^G>~V|Ie!y97d}E?^z|P}`BTvHbHb(QT;GGPfep9--|)Ws zzx&!0*$8w|T^g=Lhiqe{ze4Bkh)2_6t&1&4pN@Vh%tQl!GJFm%AiXKl^&d<3o1z~C zEivmw8!jB`_GsiI!WlS{^cCn2Yd@e3a0lj$7!TT;SAi3 zcI=!d*#ExOrah5*z8I^LUV|3ciB@hKmcfcwz$>(JNhYuFc$c_uB=;pj_k zJ-S#+Je&RwX0|66z7$@;PFVT5^qD#d-TzOb75<0zu+8&%x&O=GOVAJWZ_&@%vtCFp zMqg&z@mgH*VmcpcY)ApDKo79rk+qP`RNI)BnMcM-bT^#xQfl}PvAn>I2YT)-RLU+93A?- z=)rLiT^mJTN#6;lqR(B4mb($Xe-}E}>m$GDmh}9I=oB@IbO$`q9uMQf9?eEyB5$Du z%e|T^tbCa|IiPV`md)U9)wp}4qM{|Z>0VHDB56^t;u?5duMEA z|9hi58E%__QD81Qr&pk>^-Z+rMYknOqk)}-$6yUKz{X)mwBA8zxzXV?bVRavJYKhr z{qIjY_mg3dH-#VKeA2(756sw}KED^DBX%2lBEF0U_5u2{)@NwL-=G2Q5A)wl=`!d+ zRs%g*J7&3X2p>ix-Hkr@6w;Kf=oI zrTlK_^Hb1(=7cw4?*0F0WW0>d*+*ytf1(X!cBcx8qYa&m2G|NM*EiDVq2;Hc4P6%Z zSD;gJH@dbSj{J?7wW2MN@iChI60P9Ru;lxx;acH2=>5rPkFSXIlW~6=HYES2NLTtG z1==p`fjU<`5f3NB3a6qGUKQz;;d*q9>_7wj9(}IBhpBuCH2>7FS=a-ucTA+S z=%?6n^t<4(5840D%{x)xGxT8i9o;rXKT1Pa7kz!6j+Va>E8tydAe+#J-a-T2hn73y z<8&mKLhCyPD`QLa;2M$T!a2PFd*D*^!OzjT{VDDrM0)U+HfQEWz#Owx1)3Y zF#7y@^tl(~{yXRhe;MiQ?_A^}-IH#VLMyI{Rj~c=Ks69H8=bDLH1O-fTQNJ4jC;6n5f%R?{Z0S#u|4UP=n#K}R`g5w zNBAFF@e$vqv%U$EE&;#R19E$H@Cv5UVdV9`8D_)7YMI7n>MS43rg5RMdxr|IqUDbMC09>2)0Ybi z-hgh82ha!phc2Se;(mz(>3%h|M{Uq@qtJanKfDXAZzCG;E}V&b(GeN?YZ}qXc&_jN z*<3g`yV2M09vp**BY)&?>Hc`M;;HDnU~%MsfzIi7=*az!o`@w6ru?SpB5oJyiD*5S zVD9~Y9TzruHyX&%zo&g(9F4dG+T;G{PePZV2gtYRa}^JzIllsZeia(f1L*VX&<0;Y zpZ^FQnNEMO|Bd)OE_~o(v}X&^0-vE@$G>77Eb?b+sCn22t#}f;8!kud+m0jfJM4vB z|4RS#=}vU+e?{wS^*8%}EEkjhPQNVLg$7dhaEiP+P9)t0?b$PEgBvk7w`lpjasMD% z@nN**HUCL#qZwLmAiAr@U~8Q65Bt9_7mt(S!E)rkX-NB_bNFKT1zPcu|D_5WV|UVh z@M*jk4e&g^m2G$=Iug^v>u><+htP5b3*_gv?=e{}>`A$>4)!M98l8$|=no1%qdn-I zm!Au47&_z&(Gl5!R{S*@zz^YJ^9%5|%k%SdYo=7e{Mh_~p)aQ@N2kChphG?%+u_xC z7VgAWd=_L%7S7KNZ7;OoyznZlPI_6~e-V8*e2;!ymb>w-D^JXQzAil`HMJTYgBQ@T z`X5^3&dC1|9jnjL_vIm+jm?ft<)239Vlz5reF=6 z7xy2`a#5U&$I&5wIoyG+f{(F0Rw|Kt*aj<+J`W8fi&lICdWheRtcuJgbR-Lu%+Kx1 za%lbI(78;{0~SI{Bcg|3#erP2dk(QmBt&vOp54WSc;6t?BS7?PtoRBPo z=2t~K&=GBT6k5*&bk65uVSE5x6Hj99{|@SDE_`4!uE4G6ZWvoGHE;t~CVe*=$QC>X zccLHUAEOoS4}U|;{egBM@5D61#n8F0h(6a8bAKJA3l~N@1nt?>a6Y=2u162wx6s8} z^Q2U9bMz;Lj_6Ms=b%$LBD@d{WD#2bQZ#^j&@Yc?Ph$U@@m^&7fc{qK=#$fsRzOFh z4LY=w&{cjV`rHHP0ka|Ue?X_=m{U@@I_NIwik2H4-iVI)rc>De&dFKpK)QNf1-0(tV#-` z7P^{SVq@%q4R8@w#b?n2>NB)lxvFVyYoqCl&?EdxG>{$W7s)T^r&8Byv`71y6D7;3}+zThaOsp=;>KnrZDcKu4}8 z=Jx+ME_|KNMn~dabT>Q~et_=RKd=#&u9X7njDF;ejPw=gT3Qu8g9f+*-3?!0OZ*|y zwQ95f9g@biQ-P)ENp>5$8}2{@x-ZhtqZPi4R=5id;8S#n3)V^HtD;kRCVGDWdVfx& z?~MDK>ts`b&&Y6y3)M|?dkQ*aXX80I1s&QAI1KlqCu662DbOp?2A84%Ka758yo`?I zC+LtL4v(v!%Gb_v;RtlZp?DAW$NbZhgKz}tC($V?(;zj_5)HTyy4WV6BbG%2S%miZ zZuEO$GuFdzu{IvxFhA28v+cNWbuUC$^YiHHK8UXNlNzP3#_niEbMZ}Fg=gZF#_9ee zXvH6gM>k1x-6WiW-hT?4;^#Qu{eME!w5V2~L%b7>^e?;=Yo4B;nS!fvCLVuA?!n9w zynuA^X8HWoKuzeBeT=j5$mZz-WC6P9eu;GbGxKwQkiQZa`TqZt3%_9IwMc7W8;&V(y=VZH^nCg!|CB zJQV4F(Fcw>EA8is*pT#TXt~jmKM{RL%tjl05?u=~p}XZ{^gQ?`(!XQYj7*#KKyfTc z@?>;TRYFgyMp&)@Kb~R-(s#5?6@G(mul<-i7ux0L{(@|0oJIa3{0Ix2ou3)c^PixB zbnK9}ajy>X{vRC~m!hkBNu=)&pF`(%d-w|3UY4!7gdUDq|ti)v++vMW^5l zbZxaq*U}B>>-vfCr7RaV@FrUE9`pqK8hxLChrX}>LK{4;Yg(KQ(H`D{K7Tj*+!JU$ z>(PK;L<8B0uAxsN{VV!hHgit8D2_f*0j;1R`e3uT-vOL)XFz ztdBd4R1{7JYqAjr7yuCiEoSiZ=Kwx@P`D>nYVe z4RH+|Ou8xB;BvHs_n{qo26O*8m{+)P75|D3dD$N6i>3y80JX%^@Huqb{eU)9p=YuQ zT5(tOj30_l*+qC9ULUST7vuBj;w{rFpZ~{pF4}R?74JbS+K-;y`MpyQtDyO{(a2k& zJ?a|i^U%dLF49+`0p5g;(8K8SPeytR&LF)Vv-Y@cpVad{;b?3{{!E;R>m$E%-_&p; zw8D1iYVMCNzR~E^jYAKf>EU%)oAg8Ik81Bnx=cUzzrRLq+b>o4Fxtb7;Wo6w53neH zi3WTCb0gG0-LHavpwx?WS9FB>p#hFTr}#oNuv^1*{n`Hx)mvn^TE9gDC_5mftDr|} zKeWf!qWAAYPsm5m=QpB@a97;_2@U*jG>}3A({rWKa+T2h=GnN>1>N5R&<8I)TpRg6qCGr>23~MT+IGjGBUA(J>Dl2RG~lV2`_I8G;KCtWjSkT(Xykh$ zee}>&K_x6l{^^nKjaD=c=izMh`G3$KK*|hDi>?tGz(6#>$!Ne?%>DZMnkaB*xGoB8 z4c|vA{u=w>zmea2cz$LX>0#)Jcn}TzAavAuwvl=a55|2;T5j88+<1?}nZNY9G&(r^tH=Kjm*$LMzSht>UI!3k;2ltrhe zJUa9Z!j9+^3_;h%1rxIAC36)SW60Qv4rSAc=>!~#rtd@->8p|c1D(SPlhP2^!Mdco zqYckR53K9awRIQT;6`-Ue1tCUud`fuGW~!?R^oz`u820!9_>MIbY#Y%4_+2tiB`B2 zEq@z2=l7$5zm7HV7xeS~#L1~+ebM{b6C#f#|Msp*vXQb9-L2^^0nOickSK;K>~ z!>wo!|3m{QJ1zZOPz4>a5s|(TJxO<>0UkL$w^*~88eEvs2kpsBbO`66BXc8G!DrA4 z_e6fN3)4t6Ld!Qt%XdSEemYv;WpV!+bPDc_{O2+E*VkU*!lC~N9op~118Bv6hR4oG z>GJ66ZGe{V9Qi$Q9O+T$N%$tZ9e;}ZC(KO0wyTZSdpefRa?yng3l0yjK_h+I0{Bj( zzY7aply~(=2axy#I&IPJedtI-W^^ zljh`S7UDpxfuG_;JbG?wa3;DN=HQWd6B@uB;Zx{hd;?t*yU|a#!)QnAv+XV4HOqw+ zkH9Io13i#h&r1)sLwh(boPt(-5jr9Z!X;?Mx5WLY!cFMfdJ`?bC(?V-?e|BP3nQ#B zKkb6E(Fewc7oiO1@Vta|AW?3;PTXPWwc{WBHbS8P&PA= z3x{GFI)t~O1=ojL&<5T^1NkuWzd}E+e?v#+=mqJuTM13K#>zMlPscgvxv(C6J->q0 z{Q3V&E}Vj67N%`jA3fm)VH>SUm13_P-U*=E4ZS4Kr7#IXeM8>1v}t(X>Ms)etnW320zfVg+1-9%OHz+?Tg+Yd=2~Gp%@<-v%Rc8+8om*JjXsyTHhriRM}Jlv80kB49O=F2 z&jr1fq(2IsjP9CS&=IvN5)&|kp39vUza{cPr#w%Pemht3;poegI0I|b8kU( zk(OPW)<7lnep9qVEh9Y;{k_1jEEk=*csM+SR?z196k%7ig7d@4=suo_j=+`Z)ZK~( z_5|92jgh|#-90~{^&W`)!;#LGz9Cgm9-Y(E(K+ph4(Uwv=zIaY;eNEiRyU?09e^E4 z&&U6Fbq>&RbzdL8X;Zsto7%Q*+qP|cYCCOH+qP}nwr#!b_x$GW{8!eu*SdYq**@oD zCX=LT3{OFw^K?_)Mk>Qh%v-|Na5_}u{~(Wg&i^#G!}3s1u*$}UP%CP0>|-1OwF3cA zD_RD%LmOZ%xZU(orn`;Cfw~Q|LhVc$V+oD44c6Ufo?+^q0aFUs66+f8hZ(~kPlG#{xe3JK||Dc5@-OkK?RmER)Y#?VC-NV zU>pw>Hy7#&y4mKpq4Io$dgA?t$`gL3dr`)PdNgN(-p~K4Fi@fD$ zc8WPJgL>0>9A<=Xp;i)qp1XolP+Qy*s&HrHP^fEVI@FVMlg&@Tmdu|)HC|!9%jzBm z+Uj~x=cu)@w{a9y$1|X|Y%SE)d<<$U??N^32kM+gS>Q4Yl)W0%t6*2C+jzR!Pr;PT zJ#TE_x6o}MFI1tjP%CT(^#JJrb*{TWtzZz;`+$+g8BhyZ3AK~kpk8!NLFIc3nJNCNyS&@-Gf2!zwTYd<^xD=o!?hcn`IJ z2uoaj6d0a)Y{>P`hsX@H^{Jpb&jrR^5#T7}RH#N47}rAi?J}M< zJ}`cU@(;ZfKi&U+45Ua2b@gVG0j`C*hz>wqtv8@n^a<+RMqcKA{htA9ix0sr@HQ+D zD=c^Krdd$u{ub1=6M2QZuoTey{l82Ml(487n!wb|+d;hsOoh6*Zb2pf12e-iE8WKX zLR}LhjT4}DbeeIgaVyltd=%D&w^nlh>k*n`m0MsYRN!u?9XM^g2i4$5sFg-t?G{c0 zb#8M)HINr-r;3=p9`xQ-P=$L#?Z9|g2`*XfaR*<_vG^J{admhbhbB;4T41f4U_I0+ zI0Dtk1E`((Y4dpN-1zKJ7jY5T1hzDufbvhf-uvEfiFp9hP;b;b{-&$`LY?hJx-1--n-E0 z0ri&XD^!6ZTit+K#)eRZT0j-(1iddRHeU!;U>#H=TcPgr2c~}wwUAFxc_M669`3)G z-T|M`Dz%0usP-$=xVIu*H~^wmt?#`MFWu7w3K8QcQ%!5c6XjIqff+Vm2ekvop`HV`pdK(0cDXAq1altI$~#+PY^@J5g}A%W_bOYC|>9+U5goJ^|`WwI!y%1eNa*)V1*& z=75R!xbGusLhaOisB7);9`67245I9H3+0E}iSjnD2GvkAs1cN))_!+ofLH>Ups3o?&#$h}J{ zLKSEL<<}glvF=c(Y?95FL7l2YFcbU$*-4L+_^|tOnilHZ<%CL92`WJ&V-Kj8-LX)9 zflz)M%znUl4a)Bg)WUv1tvtdJ*S{Im%DX}D=YNA3Xa&=u&h1>N0?VPE0|%g<1LvU< zKQO+5O7sJ&(NITS#xrJt`g))g)EA*mP49uaZKuI(y8l;d0PjM*Iz>C?Hj>(y6>25< zq3+{KP=%|Ty@}b|L2dm&v(JLsq2;g=+zxBNFvmkWyB-51<;3c*d=l=nVJ20y3e{ zxz7*vvRe{rD_g)-a4=ND^k-dWgR14sP^boGntmVjXMP&$v!%x# z21=aroZDFjs04+L6`SI8&uwi=iPjMP%BSt%x3hI zv_T!HQ_vnNus_sS#Y15gI2o$3$4~`6K)qIkzToayYN#h-DX1?->pH~{yFcG|B`Y*;vmt1>FD0^|J zxaLq7`v6!&um5Kls8G_&ZUdR1Ixh_ZJU2zM>g-VbFR)$%i3J-zW@`*5;58rBqd70n5>fX;WuDKUeTX+Wj zS~wi`z3#qtI5*s%^(qXNcQ9-TFG26m|L3{szPYRf7h&iPKf!pn+;2EWzU@Asn!zII z1ED^qzX^2>#JUsGnFDh}y(hd1XTT_T-D_tB+{FAB)T`p!dm)`-@bf+He{D^!`|i1| z4|Q8~hFl!ZW~c{+{{vTF0?L0B)K0C1dat+F_yXz;iQhxF@#1h4^O;Z&x}=XnIzu#v zonidP9yjs$$L>~LfLdA9C+^E?1*rLSm=j)xx*fwmb+7siQ1WdgeA* z4r<;LYR9I)zHp0&K{+`-cURgEwr0K(Y73*kaKB}`8V+Ed@MTD6DVziKrn2ZO_Zt|i zpw6lPYxjM^K)8VU3)mfwe&c=%<}d8PeCk_wfu0cW+(&3Rs4ZU($HEBj-OdA{zCbwy zOToq;LOLtq3aA&6svkpo|1j1msB=5+lY5(8f_h`}8Ww`tKf7P?bcctTC-@T5X{`JI zAp>2_MZdaV6b^vHncsjTVZ(3k*9Xs_&SA^%A)O!aF6;-d{cta`sz2RAOQ2546JwHJ z?x|@A>xSS(2WrP7{-;yQ{a2g8UKA6do^%!dx}DF5?U=uS4Pf4$IpsxC_ zQ2J0I-9!~haPN-AW7itG?K>5FhTA)uDU+>3xp`b3_>|ywGm@=$E zA#Q*Q+yXno<8U3!8P?Z(bw7oTnWqcq>-|>BIM|%|Ygi9f4)5#zt*|w)HuGE&e7)}{ zCP6K1JuC@NKrK9qC!)JG@u3RmhjOR{bvsRm+R{5vZ%lqbt;j!;y8{`Zu7v_nPtM{{ zuWlouZr5utJxmzc*ZT=bIj9F%W7rsahB8RQ;0e^ZiX6o?q=&ky$HSCxE6fD%Ky@B5 zs(UfTfx5b@LFvapT{D4Dr*tJ$gPWo9?}F*z4akB$j&C&g>hy=&qC8ONzA8)sn?kK@ z6x7O3LnVG_d<`Qr{|dE(zR}$s^M~58Y|xv}^i81}83?^U|1*by3h#qj!FA|;fOs8v zIrihC^5KWnpzI4{xDBi`?tm(E2rhvSAhU`V!fa)vf}z-*WduC@6^IF9*asE^?~ z$8qC_$Kn20;$>Ee4*pH z3rh`kYH~r{?s?CngLh0AT;_$AAK@J8<6Zm?6G^#c%!2C2U48tXKZ@aRv7W2MP1uj7~ za1H9Ncm~z@AE;9hI+3f74Yh!bQ16V2KrN&z)Vpa<9|qdW@h~x53FUYSsx95JSM*cv(2TY#KZKx7df%;H8(Fy9>8VvR2_)MtAws^_?cawn% z{Doy<+~mIAU(9U*8!_Jl)lmEt?!}cJ>S8MbbS348=Z}(1#~o8eaWi)3ol&E~axI!Ew|3df&@6fNFFu z)Xpum`CeF;`9Y{_AbtjSNAf{6Py&XB<)KbVtqk1%u^4nR#Rzkl2esuZjXR;v=}DX4 zF}{J`YXIs!UGj`>gPoyH(FUlC^dwZiYc_ud)%fR(9@imCCbvL*VwVK&4klrK8LIKGPz{95;x-l=YM#ZzKn_KqI;{>>xCvC@ z7RL6*Zcu@Jq2k6E=bC;4)YW|es?n#$_*q?jHK>*MhKl!0WuS!1p&Hl@RrrYUG}KmJ zGW%=e52(0M+1#r=CX`<~V{xb*YGC&MPz##^)xdN}10H9SJK)c_x?6U`=D(nBr%2h| z#{8iQCWq=gyRnq9uCW8uLI&AAo9YfJ^z zNOog!sQBt;uLrdgt&M}Bo(Hpx8=x9I2KoAzi^LSyjZdJS%^z(ZDyLf@x-kya#g!Q9 zc~I2Y!Spkr3hXi-hid4G@h#K>Lg(WCmmwAdCCX&13#A_pRcId6)qTMD#q_CjyN#7K zR)Jb+ZK(K;HXmu6Yus!+nVb7x=i)vJZQ)Df2dD(!q0U*s~_VdPT zP;qym^1gz)E&nqn&FAV%c^GH~b&Z{kBaCyP5^aJ?wBP2Jpia$wsD^y8+in{-|nc^^%;{~Xd-hx`eL#UU_@5U%a+>0-ju@aPDFQ~ZjP&+f# z^b3vKp&rR+jc=g$^*=&UH!wC-U?Qka)7w11u?$p!nox~4Fnueim3O!Kbf_&~4CTKE z%Kxz0&)WP}QSN_j@e>rHQ_KyBZ%hUinAYamp)SIF#)?plHZgk_oAoZ+EC2nZrwf1(AxoD~e&v0JT#kp%PXzHh{W#TS4u}I4Hk$P^V}& z)LXraP>uV0O1KWGpc=>ym9P|)Llv7hv3Wb2_cIQMx;-bFJpiiEVyFkyPUAz)0&CD{y ze8uH)Hk)FP@dnfvpdSCt)Y6aoTxcX>N^CZU9Pz5sCJP*{VD-2bjnz6lcI8^?5P;YkELFGFN zy?+kwj42*KC3+4O@XHv!th>UvP^TiZv9{?4K{YhpxBx1C71Twz%Xr81f1&C`F30_^ zK@tYq!tBPfP+vwjHuivtnU8@gv>GaItMLTXif%&{eq{Uv^}q>H-enS~h6)>-mgoLg zz%Ud#r&FN{EQD%kHI)6J@gh{=hsH0)Fcn;VT&VaAPz~jRiZ2LNxT3MM>8DiS{+Ht- zQ>=t4uoFsu1}foY<6Wq8_#En7|26tobmy6kWuO++)Yu8?)b)q@uzLy22k(0rsKa=b z+$~CHEDNP?W9$QUpO1!WaJ+GW**8NKJZ$p|P>nx;+R0Z&r?RV$W%MLw;EO|As1;{| zdNk&=d2y(M<%|uX3U#shK$}m7ik}B{pD#5YH2qzuxF^Pski5M9y8|a$6*ob0sIS}8 zL2YpXV@39RQ!44BdGjep-xGNYHmXjVKlw|`!UcbohhIk%0UIx zfVzE}LKPZp_Q_D6V$C+rgLrgvz8!G>I=)M1atGfaIP%BJp zEDYsX6Y5p1nQ;_Ufwjg1Pz_!-K8D)z&u0H+j8wzbCx*(Kss{JJwk|sgby@-HEmIY! zcRclt-Az9Zs&F7w!Bxgx##3g$1sh<03pc@XHQkTt|H87&o7M95e!Fg6E$;uyD12(W zpT|{&<(UV$&`B0B?uwrOnb=uHv7OdPOPajGd_MX}#Ed3aAG7_S z;UGE1xGegXJiWHz*Brxs{W<1>BpypwHLTE28u*R=C`r#-bVYO(SXm6VZ6^NZu}k(E zCy?+Y1@e(R4)zG>%MmZxK;DUrH!@C0jy*K|l{^wpahyNeBs)#;|1>%^DCSQ-{2-2w<7*EZt(wcck+kq|Q=I0iidFVX&H^;t9@4u2T2!W9= zWWCaWA`3_sk_O)3IGphs>@8fgQ;&oT(fMuFrdt>c%D$W@goY34<-J;%(gX7!S;o;#fTh8x-hUNo8QmY z+u8zKn*R~>a~Kyzf7sdyO^xovRx2@#{g<>+UigOft9&3q%P!4-7 z3YVZjL<&qI*-v!ArJe2VIdVwU(*tYbkoh)e0g|$zxF=eWP|}Z+(ShPKtiu#It#eII zZJK$BZ8r&SakQj?)imCXqYrUcY~`=aUxjE7jktjvR?F{>Pi?GbsFK}lzdq`}9} z{1;HXp~YOp$Mc**lIH}?VmyhWF>vTa;d2)B2m2Amk1c5yc5DXzbG(r>NYj$hw)IJA zcrfFxG_)SuQ<~@mi`usDgKdaEMt!FwMLUqZF9oBLBrZX@m^Z>9NXpaDe*CHv*a!P} z3jDT0=9E-Q?QB(VrTz)R>;h zMXbZpDnQ^h_|~?*q7jSt#}tb*FV2|%HrPo>(g_sf1>UJ^1%Hs3mpf;wt+tUBR(uf( zH)p<+{IO{28;g#{i?~;6)5IB)Hw@@-&)>6!zWvOSh_OVknEBYa+LW4Qd%>5FUP()2 zTT;KZz4`#F(qaPq=hMnV>~$z9>4-iNai`#Qjvz^Ibz+BNSMHIlC&4qU06*a3{ifwY z0v6DBTM8s0vKsS?w#Lrr{!wfQ4f>JnEPipc5VO~VEopob914?K<+e1J+KRiXW_%-x z!ryWH#4*(zhfr*+tvo8pD>L3ja6Jlsz~?`+btl;h_OlZ{K@ytg9&)@xv4WUx0Z;EI z^86xuO+0IH?4@EP+AqZs2mMDp=P=gS>5pt13bGAR&`G*b<%>IXR$|xxT9up*JCa>8 znVgI9(L0>4@F4bZ7CVy8Qt^)1>$o4s(sptR;85M1{*dSdOR5TcqPsx*7vUBXrNciP z&0MAMXy#M#%RnA}G|PF#I3s@HIqqXmMV0i#CT39=Y)hJYx5};WZ9@N~!?*!Tp8xXNX-|x#j4_1SrF+Rw#5rZ?z8wkL zF!p0rr*PnFd9Q@Et#oJHzUcXJT_-igBq14lD6#_T=dCi?E`}msSS#2TCd2m(Tub9o z$vKc3CzyLOTcTPtae@SCm_MLM7@S%&UPM4*95=9ak}D*ZOroGsZWGI;n0p?vpaVv(u+wO3Mas} z9X7B4B^buM5_;gQ@m@rHH42k6UxZ&O;&Wq+ZabowAn9p&TH)WDaTWbR)8P~!!m*#E zVOW8r1!KuwR`7*pei0BB8$ZD4mEsi1M1dg`+Rm;;A=wH14&!$Yzkk@S;uBm#V0%v9 zeU?KuPkR2TOoC4&&=-3ZtivBTjv&D;f)d$9m56bWJZG@f5)H$z1;r(mh|k6r@4z>t z`KN;|@ae%~9$=eCJ;`|etYK-CWk{4WSXbNWzAXAt1U+NCC0JoTgmR7(oR^jRVgCqw zFz-*&mCB0n^`f&3{bP!4r=haM`;zY{I>|iZT;crx#(2lN*Ea&!Q1CaapH4%0tf|7x zXA=B}fsIY6-WR&Jmek{@)eL%dvGoj|Ot1Zw<#0w}GVf@#P~oX8_|x7XQeo+|_Bc7BO4w)Of}b z(1xQ0o!=qxR>nt3u$%;y7?(gV;RlYrGT()B3w?JIPoe2@cHSe9T#}E52642u1?{C^ z9@pgk_Z7J(a`cVB|2Om^n&&otyYNp-jo#Eut(`$;xp2}eFF7{ivr0LsH;dZ$&_%V) zSdIE2u?~G@=jcn!ee6M^A6%-ZrEY5b|Y`0vYJ1H+6ro_73FPVzD!9 z-O3Yz+J#^S)j=ZQ+ll&70-C(^^K2v{G8vMgDNObwwi{Q7>Ju!>e7Y#e!C$fQO66d- zon(GQo~&f9O^%`*H?3pWo6Ce)$qlWNdIQ`}JUMfZx9D_Yzs^b=|Q1b*G%dGch`X91;X;4v*0w!}Sf zki=u&z?#@W;^>xGwx=ZMPP3scIp0eApYX#UPBw~Xw0tr|CH6b>#N?jBco4B~*^-zc zcp6ELQ$RA1g5hizeC-6xx8y}gDtU>|ID$)%Y>73M+I+S$=Oa~z-)`_qBgXNAHS*Z% z?6cgZ5@USBae-w2kvKPrrxKjYR+c!R$s0e<19=eo$Xa`AX@;TaJFQL^A`i2NlC{k1 zkYSLuP?n6-@SAP1@|jOHenr%&#|cVrmFAMOHNHV|AA3BOoP)ms>1<0PAgfY>Fp7eMe-TN5F8J}FeI2jm$j{lUf3m1(CNEp`X#2pG||QqpC)DswqMK} z6EmEmp=s(jyEr9Sv)!$+FxVF0FG)f!??rkQ=k)~YimB_`oDGaml6*B>Zn}r~)uTu< z5@)t;oeBGrC>6Gz*rGFkPp%)t2FVNj3o;MD)*agm#wTgyx<16r##RK_Hs;p${6EQx zeG$ns*mWXvG4sF1ssb#gA4Re=|4qYZDRhV9DdQTpQ_qO|XK{5*=Ux9;5?rODXmsXF zlAZ(wNiqr_v7pXyD)uS(7iFa-7)xZnXyXcA4R3}~)}rAvG<2NY$H`d}pX9`Lqxd>_ zp9a1AUjWDO7(bxAhjJRhZ3(*0{0YZHigl$q$x+6V-6SkX%z0Hu{P1s~gveyZ(?x8f z%zraQSD?FL^H9{xik~ME|CF>OlW^F}cr#ruvVy3*68nE!#$$)V2ZGs0Gndq4w^q?a zVouo}<_E}?ghqdnFA3vlR!6?g@VV{7`tMtCE)wpcnUA)Lhs-BoOHNP`eg_W@d$sQW5%`ptc8T?96sG8;UVcwoatPi;O(a#f&(IPtm;qmHA zwTgI1PO;32a5CA85xtM4Y{EYz^QaahzdHDj#l8^RT(;#koqQu#3UW>6SP*QPx3O#5 z%4Z#nwI#ZlSD>; zmbyq*XBp1(EYWpK?lsvz{PL-Do5Xq8_5*N9z~nD}o*|ZU1&qlNfyjSw8s5iQ-yBNy zpiF4St%wSezxXUeFF9;g`Gr7d1^yS|at=vNVnX4U9RC+AH9f~(yYiOsRYkI|X*_G0 z@5jF=wJ%X;6~5z%8HkR*=;)OX#7Pp`mD-khZ>up8-*E0WI9t(g4Ay6A>oFEA#1__| z)&c6ICeI!>rlqqF1%Fb`D-S4Mj`>h`>V&ieHg#HBp~!X)j!|$4F>kEsdefH+)`VjF z24wl>=ZTGV9G25mklZqFjrHT9`lk3QD)I*~y)uR+hNb0&Z1FGC{iR|g;!olikN6ub zOOnGX4#eLtSYFw(x~uT;x663L$nhj-UtNP!jiAPsNCA0RW-}7rpn-1K-cU3d_IOa@ z!LE-)CCAAz2U}H+voyK{|HX_4V_VHU8TK2DKl<>LNNg8NbxuGl+sotx)W(UwuIH3v z+!^Pl?CEhDSdT6hzP%{+729?6+0`8S+vIA;^X_3`ucu)-nP*3FFTW12^I`$%?)UC3fP5C`2e##>0? zk8f!jI!U1nq@jzjt+=_!MD1lGrK06S8K zd1AI$GKujKl8uF-j_#bAJpeT$QuQoCh&4M&e~0c^RiC zx#T(ao{ZNrE`_Zc;kc4yQE94&oyjQpO=6yhqZEx?BQ{8W;8W84-jX9S zvH!to`1s(vjr=Ky3ldLSn{=a_M>Mj_l0ByDmdqtXVV7X5kS;UHTG@(6NI~K#6ibf2 z2MvBF&kJHM<1>+la#@|cG_x7^R&MU53Uv}<9E#Ixj=eOp45zp_97W$AdlhtluuUd$ zc57rGK0%U&;*$InmrTaL6T26J98Uu-{_!i2lc=h+aud(3MAl%uhHR2hc!$ONKU+>U zmQjkxOH>bou600?|NJ~Lh`g!YWMPTXz9CB~c$>Z?-7GpkSy$mFX=v2AQm}Caa%Ewz zU!*HW&puQ;LHt1~hKGl+Zy`@oY@IlEhvr7vfO8>BlGs}3N5!1vw9kJR;yi+(X(}24 z^O^TyN&Sc!Ow1)3=mT%UH55pSZ%ll%<9F0Hv_13K=zkE`gS?WL#5bm?@7`ZVM$w4E z^KtBg;W$p4NYIynXi(A|{bA-Cu_dEmU7DFmOfHU+*xJJbB-{wwP&gX7Bu~(NAf^fa z`dK&03E~fu>pOn`1%2ybCjpmHmSfA(kmMUYN3g_~Ci-DpPoYiNf+Uc6CG)Ak_%=Dx zQtSc+f}{}oG33fjd@9Bv$aRLf8v|_Trq84*9<;ocic9z~kte zv(4LKAdPfGCwWfM&>WJ&#E!#u7F$(v)gZ?^wtq7*k__YuCLU)Fot?#TIt(sLNjS@r zX0~A2W05R}C5fq1VXKiX8}mf?-p5{yMweLJG4%QH%S2OeXedaY>p>aIl0~F}C$@DP z%p)a1Dba1U=Hier4dbRH4%R^ro=`F0jPf_^1g@wvhVmVuIE z_#y6Ibiy%?ch2h_0V%AJ$`oCIelQCcrz0zMn;%$2bm zk!|N26I-6#(TFQajO2dM2hYBA6%WN)_>$x`-0qw}uN%)3bSbg@BiUoynbYPI4}DaM zUB#ydjg)3C*+;R`6l#a<3F8nHj*O2#_ATU@$9QXg20u~sz^NUb=VtDQv*b0$c65IU zOheK7_!Z|^z+4hGaBxV@U}y4lwU8BrS7RPX*aJc?aAf9K#76mGlXS!`IqSl?%ce<& zkYhbQ-mmB`n7*Cfe)2cDy|U0YWE#P*>2U&^alve-Nt_Vf zUFM%@AT0^fkZc=?BcZ=%O({`b^peUP@9fMvmS-rog{FH=>^uD+Lp}=srocuF9Vsqp z!|@*uRakwHTryjKd}mq0+H8D7;=9n$dmP)a8`WS24sFay{2nnVOzwTe)u7o9#MEQF zTKRMZcjK5$u~`&bO~5FeGNQ{%;_3wFWZVwB5A!?NB(qsbbdp|Y{tSI*+tR(nzhXX{ z9mz-`Ne1`=|Bbdw@u)MFaX)kkzS4_rA7nt4>Ome^mG%q z5|-ahz@+||k)V;$k~IYf_x=^-*cx5)pA{JTjMo8zl(bbR#r zb&2%1q{lF{W4sLK!yKb27$hOlhhg3p_NK@uihjdq9}Wp9bcm*(5Put6kVL>P(GR%? zNl5%I;GdE_QE9qC7*0`VRyr5wP$WHo!+7g3GaX9aV;jRbGC`6*1jfg2ARNJwgQB%a znvc~MwW9J{NIuC@^x-&);ZvVl!-$mxkgt-ykjun&O@clc#<0q`7=LgqAXx|7h5FbJ zTSGAz2jF|20#jgbe5aA@nfWHNM(1G-4e#Zr3pDMqnCs- z-Xq7Q(~ihQq~A^lp*N7NPQw7;MFo3+GBO zBT4uTC}%7zYDJ>a^|fFLlqdl{g@~2Jq3Aw*22rRW&G{1BnM1O|cHjif_r*SkJbj>~ zkjJ`hOQ9pS%9#YtwPF#hfxINGU|Y9?Mz2yh8x7oNyaE4HB+N{%lN9^x=Jx)3pWW(A zTrF(X@E?WW8`zwDS@12e1H)yGPE1nb91V`Ak0XC3?(6WfKDae)tU@tmNo8|+_Z zme8E#`IBC947Xl{&Z;}tRY%;tK~GVNcZWCVOGWA8|=O&q<^ou$qi zEswmhiMzqMI->7Q>UHoNiu*XN$Ei1lv$po}a1IGxSW}m69W7`iFTQV>pT|GAOu@G< z`8Ja;Bleff-&6Pxer3?rqk+hbFETFc!xwsCS@mEPuP_uKun~#Z5|E6*R3w-N-%{a< z6<4u$fmtH)7HR-FMza}z3CV<;Bq=F|(svSi43b-B3!2vr_ zwwkmg34u>T%csvyGr6sJoY6Q+p23a;+#+DD_1O%jrii2|M@;PgG+L4(@vNaGG@96Q zbViqxd2M{dQ0zVNiHL7a@l3=@`q6kA{J$_i$#2Iw(FsUN(d*W^oTBL;3Z=uj6ZTRZ zX-PKR8vAE#O2O2)=A}qZij2lj@`BhN!aNk`BC8#f}Rs;hQ#5}VK(oR58$?dCvq zPk6#`(qLuk?R$u5plKv3m4AlN&v4_z247?bX*KB{<+iz{f zVf@58xk38G%$u@|v2?O4s15j)*E5+aT4l7zFa}8!l^MGU$z9j z&95uI)$waW@uzIBBrOe2Mdwd!`oPJ4ygEcO_suXisTPoC1I)p?F4BYK3MtaqM*X#Q zb+_^Zv5&&<5=S=5>@aOd2`VCQ1b1k zPGNoYoZn9LHe~MqQxKiFIz7n)~TKs3)_#;K05mO5P zEHqRIN{U&|zWP+Rj}?~TJkCMV58F$M9tctxN0NLo;{ukX9*KQu^b5sm!nhPkPM*4f zO=9sJ9e_G38;}(DWE@Kwci@nWz%?P^Gx3p>qGXV4rL9D4RBn7;TZ_YB5=!(YrX5Fp zT1i06W&Fy(gD^U|;^Whd7BcIH6k`#z4MROEq5^?5(u9C?jAsT_go#*hM9$D^+rUbU z1JI4&$UsbC^u0KmF%FW-|>|zJ1alLybZn+iR;O3%|(}p@p6tqH0arn zF%YF>sWnmo$DEerE=d!x(q0sjOd~KE1(OhShU610rXYMr%sK4g(RU$7914WP?&RK zQOFkj4w0w%)68P7H;s11R@iEM(Q8u+j4?@)f&hs>9saQmo<#6LD>#L5c5K->b2mw{ z2YpZCir`zE#Mv0XBS(3TbTpF&-y|HL@s+G6UNRb8O&Zw5d{5xP_`H0yCRHlj0#HRH zJQC~LZtV=9@4=+Y1;-E`(bhQ(jy9jkwg=OQk57ATXy*mK`IuM3HXSDOXglKehRq(pHC;~GoI&{;_{lFB5_Pv2cQMlqIDq3Kb!zWSyc!F&-u+i5T- z1-HVB$9{pNWc^X(x;4&OqXk`Snx5RxJkH@(f&E>3tveBv!!sS z+|L9&#`s!AQAV-zn}7yR2YyZHlPFIB_1;-rYcoG(e%CfD2I1F9vzKrW{gk#^&$m}d fVqD*mcRqyJe&<8TeqH|$zH6g+ diff --git a/netbox/translations/ja/LC_MESSAGES/django.po b/netbox/translations/ja/LC_MESSAGES/django.po index 3fea1464b..42d623dda 100644 --- a/netbox/translations/ja/LC_MESSAGES/django.po +++ b/netbox/translations/ja/LC_MESSAGES/django.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-04-10 05:39+0000\n" +"POT-Creation-Date: 2026-04-14 05:39+0000\n" "PO-Revision-Date: 2023-10-30 17:48+0000\n" "Last-Translator: teapot, 2026\n" "Language-Team: Japanese (https://app.transifex.com/netbox-community/teams/178115/ja/)\n" @@ -178,8 +178,8 @@ msgstr "サイトグループ (slug)" #: netbox/dcim/forms/bulk_edit.py:329 netbox/dcim/forms/bulk_edit.py:679 #: netbox/dcim/forms/bulk_edit.py:866 netbox/dcim/forms/bulk_import.py:146 #: netbox/dcim/forms/bulk_import.py:247 netbox/dcim/forms/bulk_import.py:349 -#: netbox/dcim/forms/bulk_import.py:640 netbox/dcim/forms/bulk_import.py:1612 -#: netbox/dcim/forms/bulk_import.py:1640 netbox/dcim/forms/filtersets.py:106 +#: netbox/dcim/forms/bulk_import.py:640 netbox/dcim/forms/bulk_import.py:1659 +#: netbox/dcim/forms/bulk_import.py:1687 netbox/dcim/forms/filtersets.py:106 #: netbox/dcim/forms/filtersets.py:256 netbox/dcim/forms/filtersets.py:379 #: netbox/dcim/forms/filtersets.py:483 netbox/dcim/forms/filtersets.py:855 #: netbox/dcim/forms/filtersets.py:1073 netbox/dcim/forms/filtersets.py:1147 @@ -457,7 +457,7 @@ msgstr "サービス ID" #: netbox/dcim/forms/bulk_edit.py:611 netbox/dcim/forms/bulk_edit.py:809 #: netbox/dcim/forms/bulk_edit.py:1063 netbox/dcim/forms/bulk_edit.py:1162 #: netbox/dcim/forms/bulk_edit.py:1189 netbox/dcim/forms/bulk_edit.py:1723 -#: netbox/dcim/forms/bulk_import.py:1484 netbox/dcim/forms/filtersets.py:1220 +#: netbox/dcim/forms/bulk_import.py:1500 netbox/dcim/forms/filtersets.py:1220 #: netbox/dcim/forms/filtersets.py:1545 netbox/dcim/forms/filtersets.py:1761 #: netbox/dcim/forms/filtersets.py:1780 netbox/dcim/forms/filtersets.py:1804 #: netbox/dcim/forms/filtersets.py:1823 netbox/dcim/tables/devices.py:806 @@ -489,8 +489,8 @@ msgstr "色" #: netbox/dcim/forms/bulk_import.py:813 netbox/dcim/forms/bulk_import.py:839 #: netbox/dcim/forms/bulk_import.py:865 netbox/dcim/forms/bulk_import.py:886 #: netbox/dcim/forms/bulk_import.py:972 netbox/dcim/forms/bulk_import.py:1101 -#: netbox/dcim/forms/bulk_import.py:1120 netbox/dcim/forms/bulk_import.py:1465 -#: netbox/dcim/forms/bulk_import.py:1677 netbox/dcim/forms/filtersets.py:1104 +#: netbox/dcim/forms/bulk_import.py:1120 netbox/dcim/forms/bulk_import.py:1481 +#: netbox/dcim/forms/bulk_import.py:1724 netbox/dcim/forms/filtersets.py:1104 #: netbox/dcim/forms/filtersets.py:1205 netbox/dcim/forms/filtersets.py:1333 #: netbox/dcim/forms/filtersets.py:1424 netbox/dcim/forms/filtersets.py:1444 #: netbox/dcim/forms/filtersets.py:1464 netbox/dcim/forms/filtersets.py:1484 @@ -548,8 +548,8 @@ msgstr "プロバイダアカウント" #: netbox/dcim/forms/bulk_import.py:103 netbox/dcim/forms/bulk_import.py:162 #: netbox/dcim/forms/bulk_import.py:265 netbox/dcim/forms/bulk_import.py:374 #: netbox/dcim/forms/bulk_import.py:605 netbox/dcim/forms/bulk_import.py:765 -#: netbox/dcim/forms/bulk_import.py:1230 netbox/dcim/forms/bulk_import.py:1453 -#: netbox/dcim/forms/bulk_import.py:1672 netbox/dcim/forms/bulk_import.py:1735 +#: netbox/dcim/forms/bulk_import.py:1230 netbox/dcim/forms/bulk_import.py:1469 +#: netbox/dcim/forms/bulk_import.py:1719 netbox/dcim/forms/bulk_import.py:1782 #: netbox/dcim/forms/filtersets.py:208 netbox/dcim/forms/filtersets.py:268 #: netbox/dcim/forms/filtersets.py:396 netbox/dcim/forms/filtersets.py:504 #: netbox/dcim/forms/filtersets.py:901 netbox/dcim/forms/filtersets.py:1024 @@ -610,8 +610,8 @@ msgstr "ステータス" #: netbox/dcim/forms/bulk_edit.py:799 netbox/dcim/forms/bulk_edit.py:1746 #: netbox/dcim/forms/bulk_import.py:122 netbox/dcim/forms/bulk_import.py:167 #: netbox/dcim/forms/bulk_import.py:258 netbox/dcim/forms/bulk_import.py:379 -#: netbox/dcim/forms/bulk_import.py:579 netbox/dcim/forms/bulk_import.py:1471 -#: netbox/dcim/forms/bulk_import.py:1728 netbox/dcim/forms/filtersets.py:143 +#: netbox/dcim/forms/bulk_import.py:579 netbox/dcim/forms/bulk_import.py:1487 +#: netbox/dcim/forms/bulk_import.py:1775 netbox/dcim/forms/filtersets.py:143 #: netbox/dcim/forms/filtersets.py:202 netbox/dcim/forms/filtersets.py:235 #: netbox/dcim/forms/filtersets.py:363 netbox/dcim/forms/filtersets.py:442 #: netbox/dcim/forms/filtersets.py:463 netbox/dcim/forms/filtersets.py:823 @@ -797,7 +797,7 @@ msgstr "説明" #: netbox/circuits/forms/bulk_edit.py:192 #: netbox/circuits/forms/model_forms.py:199 -#: netbox/dcim/forms/bulk_import.py:1419 netbox/dcim/forms/bulk_import.py:1444 +#: netbox/dcim/forms/bulk_import.py:1427 netbox/dcim/forms/bulk_import.py:1460 msgid "Termination type" msgstr "終端タイプ" @@ -927,7 +927,7 @@ msgstr "回線タイプ" #: netbox/dcim/forms/bulk_import.py:105 netbox/dcim/forms/bulk_import.py:164 #: netbox/dcim/forms/bulk_import.py:267 netbox/dcim/forms/bulk_import.py:376 #: netbox/dcim/forms/bulk_import.py:607 netbox/dcim/forms/bulk_import.py:767 -#: netbox/dcim/forms/bulk_import.py:1232 netbox/dcim/forms/bulk_import.py:1674 +#: netbox/dcim/forms/bulk_import.py:1232 netbox/dcim/forms/bulk_import.py:1721 #: netbox/ipam/forms/bulk_import.py:200 netbox/ipam/forms/bulk_import.py:264 #: netbox/ipam/forms/bulk_import.py:300 netbox/ipam/forms/bulk_import.py:531 #: netbox/ipam/forms/bulk_import.py:544 @@ -943,8 +943,8 @@ msgstr "運用状況" #: netbox/circuits/forms/bulk_import.py:235 #: netbox/dcim/forms/bulk_import.py:126 netbox/dcim/forms/bulk_import.py:171 #: netbox/dcim/forms/bulk_import.py:383 netbox/dcim/forms/bulk_import.py:583 -#: netbox/dcim/forms/bulk_import.py:1475 netbox/dcim/forms/bulk_import.py:1669 -#: netbox/dcim/forms/bulk_import.py:1732 netbox/ipam/forms/bulk_import.py:49 +#: netbox/dcim/forms/bulk_import.py:1491 netbox/dcim/forms/bulk_import.py:1716 +#: netbox/dcim/forms/bulk_import.py:1779 netbox/ipam/forms/bulk_import.py:49 #: netbox/ipam/forms/bulk_import.py:78 netbox/ipam/forms/bulk_import.py:106 #: netbox/ipam/forms/bulk_import.py:126 netbox/ipam/forms/bulk_import.py:146 #: netbox/ipam/forms/bulk_import.py:174 netbox/ipam/forms/bulk_import.py:259 @@ -1017,8 +1017,8 @@ msgstr "インタフェース" #: netbox/dcim/forms/bulk_edit.py:445 netbox/dcim/forms/bulk_edit.py:684 #: netbox/dcim/forms/bulk_edit.py:733 netbox/dcim/forms/bulk_edit.py:875 #: netbox/dcim/forms/bulk_import.py:252 netbox/dcim/forms/bulk_import.py:355 -#: netbox/dcim/forms/bulk_import.py:646 netbox/dcim/forms/bulk_import.py:1618 -#: netbox/dcim/forms/bulk_import.py:1652 netbox/dcim/forms/filtersets.py:114 +#: netbox/dcim/forms/bulk_import.py:646 netbox/dcim/forms/bulk_import.py:1665 +#: netbox/dcim/forms/bulk_import.py:1699 netbox/dcim/forms/filtersets.py:114 #: netbox/dcim/forms/filtersets.py:358 netbox/dcim/forms/filtersets.py:393 #: netbox/dcim/forms/filtersets.py:438 netbox/dcim/forms/filtersets.py:491 #: netbox/dcim/forms/filtersets.py:820 netbox/dcim/forms/filtersets.py:864 @@ -1445,7 +1445,7 @@ msgstr "回路終端は終端オブジェクトに接続する必要がありま #: netbox/extras/models/models.py:417 netbox/extras/models/models.py:482 #: netbox/extras/models/models.py:567 netbox/extras/models/models.py:692 #: netbox/extras/models/notifications.py:126 -#: netbox/extras/models/scripts.py:31 netbox/ipam/models/asns.py:18 +#: netbox/extras/models/scripts.py:29 netbox/ipam/models/asns.py:18 #: netbox/ipam/models/fhrp.py:24 netbox/ipam/models/services.py:51 #: netbox/ipam/models/services.py:80 netbox/ipam/models/vlans.py:38 #: netbox/ipam/models/vlans.py:217 netbox/ipam/models/vlans.py:363 @@ -1690,7 +1690,7 @@ msgstr "終端" #: netbox/dcim/forms/bulk_import.py:1096 netbox/dcim/forms/bulk_import.py:1115 #: netbox/dcim/forms/bulk_import.py:1134 netbox/dcim/forms/bulk_import.py:1146 #: netbox/dcim/forms/bulk_import.py:1194 netbox/dcim/forms/bulk_import.py:1316 -#: netbox/dcim/forms/bulk_import.py:1722 netbox/dcim/forms/connections.py:34 +#: netbox/dcim/forms/bulk_import.py:1769 netbox/dcim/forms/connections.py:34 #: netbox/dcim/forms/filtersets.py:156 netbox/dcim/forms/filtersets.py:1021 #: netbox/dcim/forms/filtersets.py:1054 netbox/dcim/forms/filtersets.py:1202 #: netbox/dcim/forms/filtersets.py:1418 netbox/dcim/forms/filtersets.py:1441 @@ -4282,8 +4282,8 @@ msgstr "エアフロー" #: netbox/dcim/forms/bulk_edit.py:444 netbox/dcim/forms/bulk_edit.py:897 #: netbox/dcim/forms/bulk_import.py:362 netbox/dcim/forms/bulk_import.py:365 -#: netbox/dcim/forms/bulk_import.py:653 netbox/dcim/forms/bulk_import.py:1659 -#: netbox/dcim/forms/bulk_import.py:1663 netbox/dcim/forms/filtersets.py:123 +#: netbox/dcim/forms/bulk_import.py:653 netbox/dcim/forms/bulk_import.py:1706 +#: netbox/dcim/forms/bulk_import.py:1710 netbox/dcim/forms/filtersets.py:123 #: netbox/dcim/forms/filtersets.py:359 netbox/dcim/forms/filtersets.py:448 #: netbox/dcim/forms/filtersets.py:462 netbox/dcim/forms/filtersets.py:501 #: netbox/dcim/forms/filtersets.py:874 netbox/dcim/forms/filtersets.py:1086 @@ -4344,7 +4344,7 @@ msgstr "スキーマ" #: netbox/dcim/forms/bulk_edit.py:555 netbox/dcim/forms/bulk_edit.py:562 #: netbox/dcim/forms/bulk_edit.py:793 netbox/dcim/forms/bulk_import.py:460 -#: netbox/dcim/forms/bulk_import.py:1459 netbox/dcim/forms/filtersets.py:690 +#: netbox/dcim/forms/bulk_import.py:1475 netbox/dcim/forms/filtersets.py:690 #: netbox/dcim/forms/filtersets.py:1215 netbox/dcim/forms/model_forms.py:444 #: netbox/dcim/forms/model_forms.py:457 netbox/dcim/tables/modules.py:43 #: netbox/extras/forms/filtersets.py:413 @@ -4469,8 +4469,8 @@ msgstr "ラベル" msgid "Length" msgstr "長さ" -#: netbox/dcim/forms/bulk_edit.py:818 netbox/dcim/forms/bulk_import.py:1478 -#: netbox/dcim/forms/bulk_import.py:1481 netbox/dcim/forms/filtersets.py:1228 +#: netbox/dcim/forms/bulk_edit.py:818 netbox/dcim/forms/bulk_import.py:1494 +#: netbox/dcim/forms/bulk_import.py:1497 netbox/dcim/forms/filtersets.py:1228 msgid "Length unit" msgstr "長さの単位" @@ -4478,17 +4478,17 @@ msgstr "長さの単位" msgid "Domain" msgstr "ドメイン" -#: netbox/dcim/forms/bulk_edit.py:892 netbox/dcim/forms/bulk_import.py:1646 +#: netbox/dcim/forms/bulk_edit.py:892 netbox/dcim/forms/bulk_import.py:1693 #: netbox/dcim/forms/filtersets.py:1316 netbox/dcim/forms/model_forms.py:891 msgid "Power panel" msgstr "電源盤" -#: netbox/dcim/forms/bulk_edit.py:914 netbox/dcim/forms/bulk_import.py:1682 +#: netbox/dcim/forms/bulk_edit.py:914 netbox/dcim/forms/bulk_import.py:1729 #: netbox/dcim/forms/filtersets.py:1338 msgid "Supply" msgstr "供給電源" -#: netbox/dcim/forms/bulk_edit.py:920 netbox/dcim/forms/bulk_import.py:1687 +#: netbox/dcim/forms/bulk_edit.py:920 netbox/dcim/forms/bulk_import.py:1734 #: netbox/dcim/forms/filtersets.py:1343 msgid "Phase" msgstr "電力相" @@ -4719,7 +4719,7 @@ msgid "available options" msgstr "使用可能なオプション" #: netbox/dcim/forms/bulk_import.py:149 netbox/dcim/forms/bulk_import.py:643 -#: netbox/dcim/forms/bulk_import.py:1643 netbox/ipam/forms/bulk_import.py:512 +#: netbox/dcim/forms/bulk_import.py:1690 netbox/ipam/forms/bulk_import.py:512 #: netbox/virtualization/forms/bulk_import.py:64 #: netbox/virtualization/forms/bulk_import.py:102 msgid "Assigned site" @@ -4782,7 +4782,7 @@ msgstr "ラックタイプを指定しない場合は U 高さを設定する必 msgid "Parent site" msgstr "親サイト" -#: netbox/dcim/forms/bulk_import.py:359 netbox/dcim/forms/bulk_import.py:1656 +#: netbox/dcim/forms/bulk_import.py:359 netbox/dcim/forms/bulk_import.py:1703 msgid "Rack's location (if any)" msgstr "ラックのロケーション (存在する場合)" @@ -4848,7 +4848,7 @@ msgstr "プラットフォームが見つかりません。" msgid "Limit platform assignments to this manufacturer" msgstr "プラットフォーム割り当てをこのメーカに限定する" -#: netbox/dcim/forms/bulk_import.py:576 netbox/dcim/forms/bulk_import.py:1725 +#: netbox/dcim/forms/bulk_import.py:576 netbox/dcim/forms/bulk_import.py:1772 #: netbox/tenancy/forms/bulk_import.py:116 msgid "Assigned role" msgstr "割当ロール" @@ -5051,7 +5051,7 @@ msgid "VDC {vdc} is not assigned to device {device}" msgstr "VDC {vdc} デバイスには割り当てられていません {device}" #: netbox/dcim/forms/bulk_import.py:1103 netbox/dcim/forms/bulk_import.py:1121 -#: netbox/dcim/forms/bulk_import.py:1468 +#: netbox/dcim/forms/bulk_import.py:1484 msgid "Physical medium classification" msgstr "物理媒体の分類" @@ -5148,121 +5148,144 @@ msgstr "親デバイス A のサイト (存在する場合)" msgid "Side A device" msgstr "サイド A デバイス" -#: netbox/dcim/forms/bulk_import.py:1413 netbox/dcim/forms/bulk_import.py:1438 -msgid "Device name" -msgstr "デバイス名" +#: netbox/dcim/forms/bulk_import.py:1414 netbox/dcim/forms/bulk_import.py:1447 +msgid "Device name (for device component terminations)" +msgstr "" -#: netbox/dcim/forms/bulk_import.py:1416 +#: netbox/dcim/forms/bulk_import.py:1417 +msgid "Side A power panel" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1421 netbox/dcim/forms/bulk_import.py:1454 +msgid "Power panel name (for power feed terminations)" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1424 msgid "Side A type" msgstr "サイド A タイプ" -#: netbox/dcim/forms/bulk_import.py:1422 +#: netbox/dcim/forms/bulk_import.py:1430 msgid "Side A name" msgstr "サイド A 名" -#: netbox/dcim/forms/bulk_import.py:1423 netbox/dcim/forms/bulk_import.py:1448 +#: netbox/dcim/forms/bulk_import.py:1431 netbox/dcim/forms/bulk_import.py:1464 msgid "Termination name" msgstr "終端名" -#: netbox/dcim/forms/bulk_import.py:1428 +#: netbox/dcim/forms/bulk_import.py:1436 msgid "Side B site" msgstr "サイド B サイト" -#: netbox/dcim/forms/bulk_import.py:1432 +#: netbox/dcim/forms/bulk_import.py:1440 #: netbox/wireless/forms/bulk_import.py:114 msgid "Site of parent device B (if any)" msgstr "親デバイス B のサイト (存在する場合)" -#: netbox/dcim/forms/bulk_import.py:1435 +#: netbox/dcim/forms/bulk_import.py:1443 msgid "Side B device" msgstr "サイド B デバイス" -#: netbox/dcim/forms/bulk_import.py:1441 +#: netbox/dcim/forms/bulk_import.py:1450 +msgid "Side B power panel" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1457 msgid "Side B type" msgstr "サイド B タイプ" -#: netbox/dcim/forms/bulk_import.py:1447 +#: netbox/dcim/forms/bulk_import.py:1463 msgid "Side B name" msgstr "サイド B 名" -#: netbox/dcim/forms/bulk_import.py:1456 +#: netbox/dcim/forms/bulk_import.py:1472 #: netbox/templates/dcim/panels/connection.html:60 #: netbox/wireless/forms/bulk_import.py:133 msgid "Connection status" msgstr "接続ステータス" -#: netbox/dcim/forms/bulk_import.py:1462 +#: netbox/dcim/forms/bulk_import.py:1478 msgid "Cable connection profile" msgstr "ケーブル接続プロファイル" -#: netbox/dcim/forms/bulk_import.py:1487 +#: netbox/dcim/forms/bulk_import.py:1503 msgid "Color name (e.g. \"Red\") or hex code (e.g. \"f44336\")" msgstr "色名 (例:「赤」) または16進コード (例:「f44336\")" -#: netbox/dcim/forms/bulk_import.py:1542 +#: netbox/dcim/forms/bulk_import.py:1564 +#, python-brace-format +msgid "" +"Side {side_upper}: {power_panel} {termination_object} is already connected" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1570 +#, python-brace-format +msgid "{side_upper} side termination not found: {power_panel} {name}" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1588 #, python-brace-format msgid "Side {side_upper}: {device} {termination_object} is already connected" msgstr "サイド {side_upper}: {device} {termination_object} は既に接続されています" -#: netbox/dcim/forms/bulk_import.py:1548 +#: netbox/dcim/forms/bulk_import.py:1594 #, python-brace-format msgid "{side_upper} side termination not found: {device} {name}" msgstr "{side_upper} サイドターミネーションが見つかりません: {device} {name}" -#: netbox/dcim/forms/bulk_import.py:1569 +#: netbox/dcim/forms/bulk_import.py:1616 #, python-brace-format msgid "" "{color} did not match any used color name and was longer than six " "characters: invalid hex." msgstr "{color} 使用されているどの色名とも一致せず、6 文字を超えました。16 進数が無効です。" -#: netbox/dcim/forms/bulk_import.py:1594 netbox/dcim/forms/model_forms.py:926 +#: netbox/dcim/forms/bulk_import.py:1641 netbox/dcim/forms/model_forms.py:926 #: netbox/dcim/tables/devices.py:1144 #: netbox/templates/dcim/panels/virtual_chassis_members.html:10 msgid "Master" msgstr "マスター" -#: netbox/dcim/forms/bulk_import.py:1598 +#: netbox/dcim/forms/bulk_import.py:1645 msgid "Master device" msgstr "マスターデバイス" -#: netbox/dcim/forms/bulk_import.py:1615 +#: netbox/dcim/forms/bulk_import.py:1662 msgid "Name of parent site" msgstr "親サイト名" -#: netbox/dcim/forms/bulk_import.py:1649 +#: netbox/dcim/forms/bulk_import.py:1696 msgid "Upstream power panel" msgstr "上流電源盤" -#: netbox/dcim/forms/bulk_import.py:1679 +#: netbox/dcim/forms/bulk_import.py:1726 msgid "Primary or redundant" msgstr "プライマリまたは冗長" -#: netbox/dcim/forms/bulk_import.py:1684 +#: netbox/dcim/forms/bulk_import.py:1731 msgid "Supply type (AC/DC)" msgstr "電源タイプ (AC/DC)" -#: netbox/dcim/forms/bulk_import.py:1689 +#: netbox/dcim/forms/bulk_import.py:1736 msgid "Single or three-phase" msgstr "単相または三相" -#: netbox/dcim/forms/bulk_import.py:1739 netbox/dcim/forms/model_forms.py:1901 +#: netbox/dcim/forms/bulk_import.py:1786 netbox/dcim/forms/model_forms.py:1901 #: netbox/dcim/ui/panels.py:110 netbox/dcim/ui/panels.py:354 #: netbox/virtualization/ui/panels.py:28 msgid "Primary IPv4" msgstr "プライマリ IPv4" -#: netbox/dcim/forms/bulk_import.py:1743 +#: netbox/dcim/forms/bulk_import.py:1790 msgid "IPv4 address with mask, e.g. 1.2.3.4/24" msgstr "マスク付きの IPv4 アドレス (例:1.2.3.4/24)" -#: netbox/dcim/forms/bulk_import.py:1746 netbox/dcim/forms/model_forms.py:1910 +#: netbox/dcim/forms/bulk_import.py:1793 netbox/dcim/forms/model_forms.py:1910 #: netbox/dcim/ui/panels.py:115 netbox/dcim/ui/panels.py:359 #: netbox/virtualization/ui/panels.py:33 msgid "Primary IPv6" msgstr "プライマリ IPv6" -#: netbox/dcim/forms/bulk_import.py:1750 +#: netbox/dcim/forms/bulk_import.py:1797 msgid "IPv6 address with prefix length, e.g. 2001:db8::1/64" msgstr "プレフィックス長のある IPv6 アドレス、例:2001: db8:: 1/64" @@ -9844,23 +9867,23 @@ msgstr "サブスクリプション" msgid "subscriptions" msgstr "サブスクリプション" -#: netbox/extras/models/scripts.py:43 +#: netbox/extras/models/scripts.py:41 msgid "is executable" msgstr "実行可能" -#: netbox/extras/models/scripts.py:65 +#: netbox/extras/models/scripts.py:63 msgid "script" msgstr "スクリプト" -#: netbox/extras/models/scripts.py:66 +#: netbox/extras/models/scripts.py:64 msgid "scripts" msgstr "スクリプト" -#: netbox/extras/models/scripts.py:112 +#: netbox/extras/models/scripts.py:110 msgid "script module" msgstr "スクリプトモジュール" -#: netbox/extras/models/scripts.py:113 +#: netbox/extras/models/scripts.py:111 msgid "script modules" msgstr "スクリプトモジュール" diff --git a/netbox/translations/lv/LC_MESSAGES/django.mo b/netbox/translations/lv/LC_MESSAGES/django.mo index 0f8d2f4b3e7d9542c3fcec5e06f790f3aad583a1..e3a5b4f22b7c6a7d0b65ddf27f197c6c72bff4be 100644 GIT binary patch delta 74638 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 Gg3#f_rznBzm*) z)x`vPnJ2|Z1uM>-8^KaCZ*7tGpgaKuwO%N-36;pd$a1q*2WNGxqGZT!lE4~dS@AR7 z?!;#FHc{A3ike4qADA~ruc0>)^m6I13q3?Qjm5BV9qeHa(hy)e^O-n^$JziASI*HH{hAA{rUB;{?HnAgH-IU*DzsnpmNGpB_JG?%`Xc}`1y z7`8Qt@y_c29$cA{Sv*;@K` zf^5gu+bUS_gskmnybvGzNMfxOI}G;L^WP7{Dg-ZT!R9kwiI?s00{ykg<#-u$wL>_} z1$R?vaa$h&PcWZqNwnl>`&bgPnaTKBsCia=z0vQ$Z)T8_iqs~fa4b|6waGp=jvga_ zAL7}vzOy7y#2+p)P>&-~0 zBz-$J7wI+d|B56cVSf|7V8))N@A#)OTFpY}Hk=B=qxc6_BKmZ)ZH&W{IEs&AX-lFK z>ur#E+hlf1Egk_Lhw}M>aYT|#Mlv%($y>W|o)pL4=7-W%jC&INo5{y8pMcRBoR=kF zQIh$K@mhKY^u4Vm`o{>6hlEzb^)L^*5$NTx`-Gom`0WkXARCHLcSEelux%+3-a|<( zl2tdw=D%3akMb3C2EfwjJRtEi1doctPaZ4hms%uooncDWAF}ogAFoODG4mqO+g6ic zN&WHYWMq;Dr)pskhGQ3y>E;;S>QP!=nGgehs>3<$zX_fOoK~#Jm#$>p?$T(|Sz0{s$IMt524rZSf{S zGUE6n#@-ea$KICC}bqGtn=`P8`P1)=))A zr-+{a=PcHt@`^YuNRSc#(h)aXbw>wa*01Z8j6} z@s^6`SyI=CRT)`-=6$jKRS<(B7;m&~Nshup`WBpcTOO3_+b*0(K7$0JM%dmgMVRFE z)A(g*(NB``SS_I^FW90*M39~jWd zFVMepfMe6OOV5BHzcv8@t^Z4Vd+w)U(kF}Jtag>nj9NZECI3q>#>XclS?d75zQOHV z2Q&}q+BG1ke<8oV9-HPKo9&l;d>VD0@wtmnM#s_-&uH=6H~IDwU42To&FYt-eL%+} zgMzyI2m5vOCLZD!?BAn(Kwy^+A)VU?bk69i=;+KCU)wjujI*PBBW~Yx-6!Rs89y5M zM$JWbNA~#p1$GJc59t`vIoK~lOaGuQM;G}A;p z`}xyCM@WE_;4?q9zLH@zr Nga5~Nu`hYT{2zd;beI4D delta 74146 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